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

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

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

示例 1:

输入: [1,7,4,9,2,5]
输出: 6
解释: 整个序列均为摆动序列。

示例 2:

输入: [1,17,5,10,13,15,10,5,16,8]
输出: 7 解释: 这个序列包含几个长度为 7
摆动序列,其中一个可为[1,17,10,13,10,16,8]。

方法一:一次遍历
使用两个变量,保存当前状态和上一个状态:curr,prev;
递增和递减 数值不同,只有当前状态curr和上一个状态prev数值不等时才能说明是一个摆动序列,则 摆动序列长度增加

实现如下:

int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 2) {return nums.size();}int i;int res = 1;int prev = 0;for (i = 1; i < nums.size(); ++i) {if (nums[i] == nums[i-1]) {continue;}int curr = (nums[i]> nums[i-1]) ? 1 : -1;if (curr != prev) {res ++;} prev = curr;}return res;
}

方法二:动态规划
使用两个状态:up,down
up代表当前元素nums[i]结尾的最长摇摆序列,需满足递增条件;
down代表当前元素nums[i]结尾的最长摇摆序列,需满足递减条件;

最终的结果仅需要取两个状态中最大的即为最长的摇摆序列

实现如下:

int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 2) {return nums.size();}int down = 1, up = 1;for (int i = 1; i < nums.size(); i++) {//此时是递增状态,那么需在上一个递减状态的最大值基础上加1if (nums[i] > nums[i - 1]) up = down + 1;//此时是递减状态,那么需在上一个递增状态的最大值基础上加1else if (nums[i] < nums[i - 1])down = up + 1;}return std::max(down, up);
}

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. 摆动序列 思考分析

    目录 题目 思路分析 代码 总结 题目 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1 ...

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

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

  6. [leetcode]376. 摆动序列

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

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

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

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

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

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

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

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

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

最新文章

  1. MySQL的共享锁和独占锁
  2. Element UI级联选择器(Cascader)获取级联对象
  3. CCNA-第六篇-静态路由+动态路由开头
  4. 论文阅读笔记(一)【Journal of Machine Learning Research】Natural Language Processing (Almost) from Scratch(未完)
  5. sift算法_单应性Homograph估计:从传统算法到深度学习
  6. Java并发专题 带返回结果的批量任务运行 CompletionService ExecutorService.invokeAll
  7. HttpContext.Current.Cache在控制台下不工作
  8. Windows下Hadoop eclipse开发平台搭建
  9. linux mv命令: 移动文件或文件改名
  10. Objective-C:内存管理的小结
  11. 使用opencv-python画OpenCV LOGO
  12. 2019 最新计算机技能排名出炉:Python 排第三,第一名是...
  13. c 调用java map_如何从C中的map迭代器调用类成员函数?
  14. 学校网络认证服务器无响应,校园网常见问题
  15. m115b linux 驱动下载,m115b驱动下载
  16. 目标管理 督查督办系统
  17. Server 2003无法访问共享。您可能没有权限使用网络资源
  18. html 毛笔书写效果,利用canvas实现毛笔字帖(三)
  19. 『踩坑』pyechart绘图不出图的解决方案
  20. 惠普服务器停电后进不了系统,惠普电脑出现了startup menu 然后按f10进不去bios。进入的是Windows启动项...

热门文章

  1. [2017.02.23] Java8 函数式编程
  2. Java GC 日志详解
  3. 【学习笔记】Silverlight框架:Jounce(4)——事件通信
  4. 乌鲁木齐网络赛J题(最小费用最大流模板)
  5. java的不足_Java不足之我见
  6. 小程序picker_小程序·云开发实战 - 迷你微博
  7. ffmpeg linux安装_ffmpeg命令中文手册
  8. Bqq服务器的缓存文件放什么目录,如何使文件系统缓存失效? - How to invalidate the file system cache? - 开发者知识库...
  9. git ssh创建分支_Git(2):在gitlab中创建开发用户,以及master分支的安全管理
  10. hadoop集群_Ambari搭建hadoop集群