美文网首页
376. Wiggle Subsequence

376. Wiggle Subsequence

作者: exialym | 来源:发表于2016-11-15 13:37 被阅读38次

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;
};

相关文章

网友评论

      本文标题:376. Wiggle Subsequence

      本文链接:https://www.haomeiwen.com/subject/noikpttx.html