image.png

官方解答

image.png

贪心思路

其实思路就是找连续的波峰和波谷,跳过单调坡度上的节点
image.png

特殊位置-边界

例如序列[2,5],它的峰值数量是2,如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。所以可以针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即preDiff = 0。这也就是为什么preDiff可以取等的原因,并且result初始值为1。

  1. var wiggleMaxLength = function(nums) {
  2. //思路是找波峰和波谷,跳过单调坡度上的节点
  3. if(nums.length<=1) return nums.length; //1个节点自带坡度。
  4. let preDiff =0; //左坡度
  5. let curDiff =0; //右坡度
  6. let result =1; //基值为1?
  7. for(let i =0;i<nums.length-1;i++){
  8. curDiff =nums[i+1] -nums[i];//右坡度
  9. if((preDiff<=0 &&curDiff>0) || (preDiff>=0&&curDiff<0)){
  10. //判断波谷|波峰【等号是考虑了边界情况,可以认为人为引入一个坡度为0的节点】
  11. preDiff =curDiff; //更新
  12. result++;
  13. }
  14. }
  15. return result;
  16. };
  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(1)$

    动态规划