376. Wiggle Subsequence

题目理解

给定一个数组,相邻两个数计算差值。差值排成的序列是正负相间的,那这个数组就是一个wiggle 数组。例如数组[1,7,4,9,2,5],差值序列是(6,-3,5,-7,3)。原数组用坐标轴表示如下。


思路是:在一段连续上升或者连续下降的线段上,那只保留两端的断点(这是贪心思想的体现),去掉中间的断点,就能使得子序列符合要求。例如在AB线段上,去掉中间点A1,A2A1,A2A_1,A_2,在BC线段上去掉B1,B2B1,B2B_1,B_2,那留下在子序列[A,B,C]就是符合要求的,并且是长度最长的wiggle子序列。
证明:要证明上面的思路是正确的。可以使用反证法。假如在一段连续上升的线段中不是保留最顶点B,而是留下A2A2A_2点,删除一个点,添加一个点,总长度不发生变化。那会影响其他点吗?A2<BA2<BA_2 。B点之后是一段下降的线段。<A2<A2<script type="math/tex" id="MathJax-Element-879"><B<B<script type="math/tex" id="MathJax-Element-880"><B<B<script type="math/tex" id="MathJax-Element-881"><A2<A2<script type="math/tex" id="MathJax-Element-882">A2A2A_2替换B没有任何好处。可以用同理分析下降线段中去掉中间点是最合理的。
学习:对于每一种解决方法是应该有证明的。此外,本题目还要考虑各种变化趋势,增加测试数据。
考虑:先直线再折线;先折线再直线;折线折线直线;折线直线折线。

public int wiggleMaxLength(int[] nums) {if(nums.length<=1){return nums.length;}int ans = 1;int diff = nums[1]-nums[0];if(diff!=0){ans++;}for(int i=2;i<nums.length;i++){if(nums[i]!=nums[i-1]){if(diff * (nums[i]-nums[i-1])<=0){ans++;}diff = nums[i]-nums[i-1];}}return ans;}

376 Wiggle Subsequence 贪心解法以及证明相关推荐

  1. 【Leetcode】376. Wiggle Subsequence

    Description: A sequence of numbers is called a wiggle sequence if the differences between successive ...

  2. leetcode 376. Wiggle Subsequence | 376. 摆动序列(动态规划)

    题目 https://leetcode.com/problems/wiggle-subsequence/ 题解 刷题大概确实是有效果的吧- 印象中,这算是今日第二道,全局第三道没看答案写出来的 dp ...

  3. 蓝桥杯:旅行家的预算 贪心解法

    蓝桥杯:旅行家的预算 贪心解法 问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距 ...

  4. 编程之美 - 读书笔记 - 卖书折扣问题的贪心解法

    <编程之美>读书笔记(四):卖书折扣问题的贪心解法 每 次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话 ...

  5. 《编程之美》读书笔记(四): 卖书折扣问题的贪心解法

    <编程之美>读书笔记(四):卖书折扣问题的贪心解法 每次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话, ...

  6. [Leetcode 376]摇摆序列 Wiggle Subsequence

    [题目] A sequence of numbers is called a wiggle sequence if the differences between successive numbers ...

  7. 贪心:Wiggle Subsequence 摇摆序列

    一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,则该序列被称为 摇摆序列.一个小于2个元素的序列直接为摇摆序列.给一个随机序列,求这个序列满足摇摆序列定义的最长子序列的长度: 输入[1,1 ...

  8. ICG游戏:尼姆游戏异或解法的证明

    描述: 尼姆博奕(Nimm Game),有n堆石子,每堆石子有若干石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限.取走最后石子的人获胜. 标准解法: 判断: 先计算先手是必胜还是 ...

  9. LeetCode Wiggle Subsequence(动态规划)

    问题:给出一个数组,求波动序列的最大长度. 思路:方法一使用up(i)表示第i个元素是上升时最大长度,down(i)表示第i个元素是下降时最大长度.则有up(i)=max(down(j) +1, up ...

最新文章

  1. python实现案例_基于Python实现相关分析案例
  2. 闭包造成的内存泄露怎么解决?
  3. 软件工程第八次作业——例行报告
  4. java webservice soap请求_使用Java对WebService的SOAP请求
  5. oracle删除数据释放表空间流程
  6. 字节工程师薪资排世界第五,中位数 43 万美元,2021 全球程序员收入报告出炉!...
  7. 使用WebStorm/IDEA开发调试Vue/Webpack工程项目
  8. 实验3:视频播放小程序
  9. 性能测试tps上不去,又是redis的坑,说多了都是泪啊
  10. 2024考研《艺术学概论》彭吉象|复习笔记(下篇)(7-12章)
  11. 分布式链路追踪opentracing-go jaeger小示例
  12. 社团招新如何吸引新人,制作一张好的海报最关键
  13. SAP Enhancement 分类
  14. 总结2019大前端开发十大战略性技术布局
  15. QT使用MSVC编译时报错C2001: 常量中有换行符
  16. win7计算机建立无线网络连接不上,win7无线网络显示❌,win7连不上无线网显示红叉...
  17. 贝叶斯优化: 一种更好的超参数调优方式
  18. 【大学物理·光学】薄膜干涉
  19. 机器人 郑佳佳_浙大硕士造了个充气娃娃 和她结婚了
  20. Android:Android系统中安装的数据文件夹在哪个位置,如何删除wps下载下来的文件

热门文章

  1. C# 实例练习——字符串处理(第三天)
  2. EJB是什么?EJB的概念分析与理解(copy)
  3. 洛谷 P3392 涂国旗
  4. 关于android 调用网页隐藏地址栏
  5. 获取Android版本信息和电话信息
  6. 转使用jQuery Ajax的内存回收
  7. 《C Traps and Pitfalls》 笔记
  8. oracle的工具cmd,数据库命令行工具DBCLI
  9. java 转换url中文参数
  10. vue开发小程序Demo