[leetcode]376. Wiggle Subsequence -- JavaScript代码

来源:互联网 发布:ubuntu14.04 软件源 编辑:程序博客网 时间:2024/06/16 07:50

这道题目的要求是:
给定一个数组,要求不改变元素顺序,从这个数组里找到一个最长子数组,该子数组中的元素要求一大一小的依次排列。返回值就是这个最长子数组的长度。

这道题给的标签是DP和贪心算法。

PS:代码效率不算很高,欢迎大家改进指正。

JavaScript代码如下:

/** * @param {number[]} nums * @return {number} */var wiggleMaxLength = function(nums) {    var wiggle = [];    if(nums.length===0){        return 0;    }    if(nums.length==1){        return 1;    }    if(nums[0]>nums[1]){        high = nums[0];        low = nums[1];        flag = 0;// 0表示需要升高,1表示需要下降    }else if(nums[0]<nums[1]){        high = nums[1];        low = nums[0];        flag = 1;// 0表示需要升高,1表示需要下降    }else{        high = low = nums[0];        wiggle.push(nums[0]);        flag = 2;// 2表示未知    }    nums.forEach(function(item){        if(flag===0){            if(item>low){                high = item;                wiggle.push(item);                flag = 1;            }else if(item<low){                low = item;                wiggle.pop();                wiggle.push(item);            }        }else if(flag==1){            if(item<high){// 需要下降                low = item;                wiggle.push(item);                flag = 0;            }else if(item>high){                high = item;                wiggle.pop();                wiggle.push(item);            }        }else{            if(item>low){                flag = 0;            }else if(item<high){                flag = 1;            }        }    });    return wiggle.length;};

思路1:首先,要考虑给定数组只有1个或没有元素的特殊情况。

思路2:用flag,high,low来记录数据——flag:现在是需要找比上一个元素大的数字,还是需要找比上一个元素小的数字。high/low:当需要找比上一个元素小(大)的下一个元素的时候,那个用来做比较的“上一个元素 ”。

但是这里,需要一点贪心算法的思路:例如,当我们要寻找比上一个元素小的元素的时候,如果遇到的不是更小的元素,反而是更大的元素,那么我们就应该用这个更大的元素来替代上一个元素。这样,就放宽了对下一个小元素的要求范围,可以期望得到更优的答案。

思路3:需要考虑如果元素都相等要怎么办?这就是flag = 2的作用。

0 0
原创粉丝点击