开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
376. 摆动序列
题目分析
给出一个整数数组,返回数组中为摆动序列的最长子序列的长度。其中摆动序列要求连续数字之间的差在正数和负数之间交替。特别要注意的是只有一个元素或者有两个不相等元素的序列,也是摆动序列。
贪心算法
贪心算法的本质是选择一部分局部最优,从而达到全局最优。贪心算法并没有解题模板之类的东西。需要自己模拟一下,如果可以就尝试贪心算法。
解题
我们需要通过从给出的数组中删除一些元素来获取子序列,所以最重要的是判断应该删除哪些元素。将这些数字画成一张图,我们只需要删除在同一个坡上的节点就可以有最顶峰和最底峰,这样就可以达到摆动的效果。
这样我们可以把6 11 和 5 删去得到最优解。
这里需要注意的是,数组最左面和最右面的元素是特殊的。如果排除掉数组中只有一个元素的情况返回一,数组中有两个元素的情况,要特殊考虑。如果两个元素不相等,那么就返回2。
代码如下:
var wiggleMaxLength = function(nums) {
if(nums.length <=1) return nums.length
let res = 1,preDiff = 0,curDiff = 0
for(let i = 0;i < nums.length - 1;i++) {
curDiff = nums[i + 1] - nums[i]
if(curDiff > 0 && preDiff <= 0 || curDiff < 0 && preDiff >= 0) {
res++
preDiff = curDiff
}
}
return res
};
上面将res默认置为一,判断前面的差和当前的差是否是反向的,需要注意的是将第一个0考虑进去。
后记
本题还可以使用动态规划的方法解决,但是目前只掌握了贪心的解法,等下一阶段学习动态规划后,可以将题目对比不同写法。