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