376. Wiggle Subsequence

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;
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容