目录

  • 题目
  • 思路分析
  • 代码
  • 总结

题目

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

思路分析

画出序列波动图:

可以发现,我们删除的是单调递增或者递减的坡上的结点(不包括坡顶和坡底)
局部最优:删除单调坡度上的结点,那么这个坡度就可以有两个局部峰值
全局最优:整个序列有最多的局部峰值,从而达到最长摆动序列。
实际操作中只需要统计数组中的峰值数量即可。
在实际操作中的时候我们需要用到cur_delta = nums[i] - nums[i-1],pre_delta = nums[i-1] - nums[i-2].
从数组的左端开始,默认序列右端是个峰值。
如果cur_delta >0 && pre_delta <=0 或者 cur_delta <0 && pre_delta >=0,我们认为存在一个峰值。
(因为 pre_delta 被初始化为 0 了,所以这里要加上=号)
并且,只有在存在峰值的时候,我们才更新pre_delta ,因为统计的是峰值,一定是以上一下的,prediff之前是上,接下来就是下

代码

class Solution {public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();if(n<=1) return n;int peak_nums=1;int delta_pre_curr=0;int delta_ppre_pre=0;for(int i = 1;i < n;i++){delta_pre_curr=nums[i]-nums[i-1];if((delta_pre_curr > 0 && delta_ppre_pre <= 0) || (delta_pre_curr < 0 && delta_ppre_pre >= 0)){peak_nums++;delta_ppre_pre=delta_pre_curr;}}return peak_nums;}
};

总结

1.保持区间波动,只需要把单调区间上的元素移除就可以了。
2.因为题目并不需要我们确定最终的序列是什么,所以其实只是要找整个序列单调增/减了几次。
3.为什么可以将previous diff设置为0是因为他只会在一开始等于0,后面他会被current diff更新,并且如果current diff不满足严格正/负变符号他就不会更新previous diff,所以len(nums)==2不需要单独拿出来写几行代码
4. res从1开始记录,因为出发点肯定算一个

leetcode 376. 摆动序列 思考分析相关推荐

  1. leetcode - 376. 摆动序列

    376. 摆动序列 -------------------------------------------- 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在 ...

  2. LeetCode 376. 摆动序列 中等难度

    376. 摆动序列 题目: 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如: [1,7,4,9 ...

  3. LeetCode 376. 摆动序列(贪心 动态规划)

    文章目录 1. 题目 2. 解题 2.1 贪心 2.2 动态规划 1. 题目 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个 ...

  4. leetcode 376. 摆动序列(dp)

    如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个摆动序列, ...

  5. [leetcode]376. 摆动序列

    原文:https://leetcode-cn.com/problems/wiggle-subsequence/solution/bai-dong-xu-lie-by-leetcode/ 给定一个整数序 ...

  6. Leetcode 376. 摆动序列 解题思路及C++实现

    解题思路: 使用贪心算法的思想. 在例子 [1,17,5,10,13,15,10,5,16,8]中,[1, 17].[17, 5]这前面的两个序列就直接都选择了,没有问题,对于后面[5, 10, 13 ...

  7. 【LeetCode】376. 摆动序列(图解)

    376. 摆动序列 一.问题 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4, ...

  8. 【LeetCode每日一题】——376.摆动序列

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[解题思路] 七[题目提示] 八[题目进阶] 九[时间频度] 十[代码实现] 十一[提交结果] 一[题目类别 ...

  9. 贪心1|455.分发饼干|376. 摆动序列|53. 最大子序和

    贪心1|455.分发饼干|376. 摆动序列|53. 最大子序和 一.455.分发饼干 题目连接:455. 分发饼干 - 力扣(LeetCode) 思路1:用贪心思想,将饼干数组和胃口数组先排序,然后 ...

最新文章

  1. 福建高职单招计算机基础知识,福建高职单招计算机类试题及标准答案
  2. IDEA配置SVN并实现代码版本控制
  3. 家用电脑虚拟机做服务器_家用电脑能当服务器吗
  4. CMake基础 第5节 安装项目
  5. 51Nod - 1024 矩阵中不重复的元素(数学)
  6. C#/Net代码精简优化技巧(1)
  7. 3d数学基础图形与游戏开发 英文版_1850款文字标题字幕条,AE图形预设包,logo生成神器...
  8. SQL UNION 和 UNION ALL 操作符(mysql)
  9. 2020牛客国庆集训派对day8
  10. Jsp、Servlet
  11. PWM调光方法在LED亮度调节中的应用
  12. 制图折断线_学不好CAD怎么办?老师傅教你CAD制图规范,新手也能秒懂
  13. ubuntu jdk 1.7 安装
  14. J-LINK烧录bin文件
  15. 解读LED灯具中国能效认证
  16. 小米电视看电脑共享文件服务器,小米电视怎么共享电脑看本地视频【图文】
  17. 自己撸一个Wordcount
  18. java wtc_WTC的配置(二)
  19. C++typedef的用法
  20. iphone两个备份合并_看完这篇干货,再备份iPhone数据

热门文章

  1. 前端面试题之http/HTML/浏览器(二)
  2. python爬取ajax动态内容肯德基门店,Python爬虫如何爬取KFC地址
  3. python 函数递归一次增加一次变量_python函数局部变量、全局变量、递归知识点总结...
  4. cshtml中引用css_ASP.NET CoreMVC 中的控制器
  5. linux 查看文件哈希码,使用linux的sha1sum命令查看效验文件哈希值命令
  6. [one day one question] safari缓存太厉害
  7. web前端-回调函数sort详解
  8. 响应式方案调研及前端开发管理思考
  9. androidmanifest.xml权限中文说明
  10. Codeforces Global Round 2 D. Frets On Fire (动态开点线段树,沙雕写法)