原文:https://leetcode-cn.com/problems/wiggle-subsequence/solution/bai-dong-xu-lie-by-leetcode/


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

这个删除是指删除上升后又接着上升的元素

1、暴力:超时


2、动态规划:


up[i]是目前为止最长的以第i个元素结尾上升的摆动序列的长度。
down[i]是目前为止最长的以第i个元素结尾下降的摆动序列的长度。

class Solution {public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();if(n < 2){return n;}vector<int>up(n, 0);vector<int>down(n, 0);for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(nums[j] < nums[i]){up[i] = max(up[i], down[j] + 1);}else if(nums[j] > nums[i]){down[i] = max(down[i], up[j] + 1);}}}return 1 + max(down[n-1], up[n-1]);//up[i] >= down[i-1];  down[i] > up[i-1]; +1是第一个没算}
};

3、线性动态规划:

class Solution {public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();if(n < 2){return n;}vector<int>up(n, 0);vector<int>down(n, 0);up[0] = down[0] = 1;for(int i = 1; i < n; i++){if(nums[i] > nums[i-1]){up[i] = down[i-1] + 1;down[i] = down[i-1];}else if(nums[i] < nums[i-1]){down[i] = up[i-1] + 1;up[i] = up[i-1];}else{up[i] = up[i-1];down[i] = down[i-1];}}return max(down[n-1], up[n-1]);}
};

4、空间优化:

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();if(n < 2){return n;}int up = 1;int down = 1;for(int i = 1; i < n; i++){if(nums[i] > nums[i-1]){up = down + 1;}else if(nums[i] < nums[i-1]){down = up + 1;}}return max(up, down);}
};

5、贪心



class Solution {public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();if(n < 2) return n;int prediff = nums[1] - nums[0];int count = prediff == 0 ? 1 : 2;for(int i = 2; i < n; i++){int diff = nums[i] - nums[i-1];if((diff > 0 && prediff <= 0) || (diff < 0 && prediff >= 0)){//prediff == 0只在开始出现count++;prediff = diff;}} return count;}
};

[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. 摆动序列 解题思路及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. 中文语音识别pytorch
  2. Openwrt中ppp拨号总结
  3. 三十六、深入Vue.js组件Component(上篇)
  4. 经典C语言程序100例之六三
  5. (原创)结构体自动化转为char数组的实现
  6. 最新、最前沿AI论文哪里找?
  7. git commit撤销_Git 实用操作:撤销 Commit 提交
  8. Python高级知识点学习(九)
  9. python文件批量重命名以数字~n的方式重命名_利用Python对文件进行批量重命名
  10. TP5实践小总结(1)
  11. fb静态区域_西门子 PLC FC和FB用法讲解
  12. 61850协议服务器端开发,基于IEC61850标准的服务端程序的设计与实现
  13. adventureworks mysql_adventureworks
  14. 什么是Apache APR
  15. CenOS7 搭建无人值守安装服务器
  16. 简单好用的Linux服务器管理面板——宝塔面板
  17. Maven项目右边依赖好多红色波浪线处理办法
  18. c语言luhn算法生成校验位,银行卡号码校验算法(Luhn算法,又叫模10算法)
  19. python-pdf的去水印操作
  20. 词向量系列之One-Hot编码详解

热门文章

  1. python为什么叫爬虫-python为什么叫爬虫?为什么python开发会突然火起来?
  2. 如何系统的自学python-怎样才能彻底系统的自学python?!白Python菜鸟教程
  3. python 下载文件-Python实现HTTP协议下的文件下载方法总结
  4. 深度学习与人类语言处理-语音识别(part1)
  5. 科大讯飞独家Founding赞助国际语音顶会,14篇论文被收录
  6. 国内有哪些做H5走心的外包服务团队或公司?
  7. Redis必须要知道的几点
  8. Python笔记:变量的作用域
  9. FFmpeg源代码简单分析:av_write_trailer()
  10. ffmpeg中的sws_scale算法性能测试