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.
Examples:
Input: [1,7,4,9,2,5]
Output: 6
The entire sequence is a wiggle sequence.
Input: [1,17,5,10,13,15,10,5,16,8]
Output: 7
There are several subsequences that achieve this length. One is [1,17,10,13,10,16,8].
Input: [1,2,3,4,5,6,7,8,9]
Output: 2
在数组中找到最长的交替序列。
我们用一个数组tails来维护这个最长的序列。
用一个标志位来记录上一个元素是增是减。
每遍历到一个新元素:
如果与tails末尾相等就跳过;
如果比tails末尾大且tails末尾相对前一个是增的,那把末尾替换为当前元素;
如果比tails末尾小且tails末尾相对前一个是增的,那把当前元素压入tails;
如果比tails末尾大且tails末尾相对前一个是减的,那把当前元素压入tails;
如果比tails末尾小且tails末尾相对前一个是减的,那把末尾替换为当前元素;
这样遍历完就得到了最长增减序列。
var wiggleMaxLength = function(nums) {
var num = nums.length;
if (num < 2)
return num;
var tails = [nums[0]];
var flag = 0;
for (var i = 1;i < num;i++) {
if (nums[i]===tails[tails.length - 1])
continue;
if (flag===0) {
flag = nums[i] - tails[0];
tails.push(nums[i]);
}
else if (flag<0) {
if (nums[i]>tails[tails.length - 1]) {
flag = 1;
tails.push(nums[i]);
} else {
tails[tails.length - 1] = nums[i];
}
} else {
if (nums[i]>tails[tails.length - 1]) {
tails[tails.length - 1] = nums[i];
} else {
flag = -1;
tails.push(nums[i]);
}
}
}
return tails.length;
};