题目描述

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

例如, [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]。

示例3

输入:
[1,2,3,4,5,6,7,8,9]
输出:
2

题解

这题题面说的啰里啰唆的,其实就一句话:给你一个序列,找出最长的一个子序列,其中子序列相邻两个数的大小是波形的(也就是大小大小大等等这样的)。

暴力法

用 dfs 枚举所有可能的子序列,然后看最长的是多少,这种方法显然会超时。

动态规划

其实看到这道题,我第一个想到了最长上升子序列,这不就变了个形式嘛,于是动态规划解法直接就有了。

表示以
结尾的符合条件的最长子序列长度,其中 s 取 1 表示在
处子序列上升,取 0 表示下降。那么我们只需要遍历之前的所有 j ,如果
,那么在 j 处必须是要下降的,更新:

如果

,那么在 j 处必须是要上升的,更新:

然后取数组中最大值就是答案了,时间复杂度

动态规划+时间优化

换个定义,用

表示
之前的最长子序列,注意和上面的区别就是不一定以
结尾了。 s 取 1 表示最后两个数是上升的,取 0 表示最后两个数是下降的。

这里分为几种情况:

  • :
    • 考虑

      ,也就是最后两个数下降的,那肯定不能取
      ,因为
      比它更小、更优,所以直接更新为
    • 考虑
      ,也就是最后两个数上升的,那如果不取
      ,那更新为
      ;如果取的话,我们就要保证 i-1 之前最后两个数是下降的,并且之前的最后一个数小于
      。我们可以证明, i-1 之前的最后两个下降的数一定满足:第二个数
      是小于
      的,因为如果
      ,那么 j 到 i 之间的数一定是单调下降的,否则存在更长的子序列,那么就和
      矛盾了。综上,取的话
      更新为
  • : 同样考虑最后两个数上升还是下降,分析和上面一样。

综上考虑,时间复杂度可以降为

,空间复杂度是

动态规划+空间优化

在上面优化的基础上,我们还可以观察到,每一次

其实只会用到
,所以我们只需要保存当前和前一时刻的状态就行了,空间复杂度可以降为

贪心法

其实这题还可以直接贪心做,考虑一段连续的上升序列,最优子序列一定是包括了首尾两个数的,因为首是最小的数,选了它才能给前一个数留出更大的上升空间,而尾是最大的数,选了它才能给下一个数留出更多的下降空间。

所以我们贪心的扫描一遍数组,遇到上升或者下降的转折点就选取这个数。而如果数组不升不降,也就是不变的话,就不用管它,因为这些相同的数里面只需要选取一个就行了。

时间复杂度是

,空间复杂度是

代码

动态规划(c++)

class 

动态规划+时间优化(c++)

class 

动态规划+空间优化(c++)

class 

贪心(c++)

class 

后记

鼠年快乐,新年献给大家的第一道题,尽量写的详细一点。

官方题解没有严谨的证明,虽然方法也是这 5 种,但是没有说清楚,不能令人信服。

找出最具竞争力的子序列_每日算法系列【LeetCode 376】摆动序列相关推荐

  1. 找出最具竞争力的子序列_力扣300——最长上升子序列

    这道题主要涉及动态规划,优化时可以考虑贪心算法和二分查找. 原题 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18]输出: 4 解释: ...

  2. LeetCode 1673. 找出最具竞争力的子序列(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums 和一个正整数 k ,返回长度为 k 且最具 竞争力 的 nums 子序列. 数组的子序列是从数组中删除一些元素(可能不删除元素 ...

  3. 序列复杂度怎么看_每日算法系列【LeetCode 376】摆动序列

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

  4. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和

    题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...

  5. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...

    题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...

  6. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...

    题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...

  7. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...

    题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  8. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  9. TOP100summit分享实录 | 有赞程功夫:打造最具竞争力的SaaS解决方案

    本文内容节选自由msup主办的第七届全球软件案例研究峰会,现任有赞产品总监程功夫,分享的<有赞在SaaS领域的产品设计观>实录. 本文为有赞产品总监程功夫在TOP100summit上的演讲 ...

最新文章

  1. 这年头,做 Python 不懂点数据结构与算法真不行!
  2. Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布
  3. struts 2.x版本 datetimepicker日期控件的使用
  4. 问题 D: 二叉树求高度
  5. 连接 Microsoft Cloud App Security 的数据
  6. jpa java.util.map_使用JPA存储Map String,String
  7. MTK 驱动---(8)emmc 介绍
  8. 小米MIX 4要来了?这硬件“堆”的也是没谁了 全是最新技术
  9. 贝叶斯网络(Bayesian network))简介(PRML第8.1节总结)概率图模型(Graphical models)...
  10. phabricator安装配置和使用(docker安装和独立部署)
  11. 工具-IDEA 好看的样式字体/字号/
  12. Rsshub如何通过docker命令搭建
  13. 深度学习中对神经网络的理解
  14. 丁磊向左,刘强东向右
  15. 爱奇艺APP的自动化录制回放系统 全云化处理新体验
  16. 某电商网站的数据库设计(6)——创建查询销售数据的视图
  17. 苹果xr截屏怎么截_原来苹果手机可实现长截屏!学到了,以后不用羡慕别人手机了...
  18. 荣耀6手机apk清单
  19. 安装Bumblebee解决Ubuntu笔记本发热量大问题
  20. C++实现找100(任意)以内的质数--非常好的算法

热门文章

  1. findwindowex子窗口类型有哪几种_游戏场景该怎么画?来参考一下不同的类型吧
  2. ide循环执行用例 selenium_使用Selenium测试Web界面时使用循环控制功能
  3. java oop试题_java oop 试题
  4. 机器学习代码实战——梯度下降(gradient descent)
  5. Python数据结构与算法笔记(一):时间复杂度与空间复杂度
  6. OCR技术系列之四】基于深度学习的文字识别(3755个汉字)(转)
  7. 08-求解Ax=b:可解性和解的结构
  8. 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引...
  9. 常用设计模式的小结和实际中的应用
  10. less 使用小结!笔记!