Saturday, October 3, 2020

376. Wiggle Subsequence ----M !!!!!!!!!~~~~~~~~~

 A sequence of numbers is called a wiggle sequence if the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either positive or negative. A sequence with fewer than two elements is trivially a wiggle sequence.

For example, [1,7,4,9,2,5] is a wiggle sequence because the differences (6,-3,5,-7,3) are alternately positive and negative. In contrast, [1,4,7,2,5] and [1,7,4,5,5] are not wiggle sequences, the first because its first two differences are positive and the second because its last difference is zero.

Given a sequence of integers, return the length of the longest subsequence that is a wiggle sequence. A subsequence is obtained by deleting some number of elements (eventually, also zero) from the original sequence, leaving the remaining elements in their original order.

Example 1:

Input: [1,7,4,9,2,5]
Output: 6
Explanation: The entire sequence is a wiggle sequence.

Example 2:

Input: [1,17,5,10,13,15,10,5,16,8]
Output: 7
Explanation: There are several subsequences that achieve this length. One is [1,17,10,13,10,16,8].

Example 3:

Input: [1,2,3,4,5,6,7,8,9]
Output: 2

Follow up:
Can you do it in O(n) time?

A:

哎,看着很难,可是我真正开了番茄,逼迫自己想的时候。

其实还是可以25分钟内做出来的。 反而直接bug free

核心就是: 每次找到寻找下一个bigger, (or 下一个smaller)  如果找到,则皆大欢喜。

否则,就调整前一个pre(which should be less than its left, )


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if(nums.size()==0)
            return 0;
        return max(helper(nums,1,false), helper(nums,1,true));
    }
private:
    int helper(vector<int>& nums, int start, bool isNextBigger){
        int n = nums.size();
        int pre = nums[start-1];
        int res = 1;
        for(int i= start; i< n; i++){
            int cur = nums[i];
            if(isNextBigger){
                if(cur > pre){
                    isNextBigger = ! isNextBigger;
                    pre = cur;
                    res++;
                }else{ // cur <= pre
                    if( i-2 < 0 || cur < nums[i-2] ){
                        pre = cur;
                    }
                }
            }else{ // we want cur should be smaller than previous
                if(cur < pre){
                    isNextBigger = ! isNextBigger;
                    pre = cur;
                    res++;
                }else{ // we want a smaller value, but get a bigger one
                    if(i-2<0 || cur > nums[i-2] ){
                        pre = cur;
                    }
                }
            }
        }
        return res;
    }
};


Mistakes:

唯一的,就是没有检查 空输入,因为我们直接从nums[1] 开始的。


其实还有一个情况,是, 没有检查nums[0] 是否为INT_MIN or INT_MAX. 






No comments:

Post a Comment