376 Wiggle Subsequence 贪心解法以及证明
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 贪心解法以及证明相关推荐
- 【Leetcode】376. Wiggle Subsequence
Description: A sequence of numbers is called a wiggle sequence if the differences between successive ...
- leetcode 376. Wiggle Subsequence | 376. 摆动序列(动态规划)
题目 https://leetcode.com/problems/wiggle-subsequence/ 题解 刷题大概确实是有效果的吧- 印象中,这算是今日第二道,全局第三道没看答案写出来的 dp ...
- 蓝桥杯:旅行家的预算 贪心解法
蓝桥杯:旅行家的预算 贪心解法 问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距 ...
- 编程之美 - 读书笔记 - 卖书折扣问题的贪心解法
<编程之美>读书笔记(四):卖书折扣问题的贪心解法 每 次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话 ...
- 《编程之美》读书笔记(四): 卖书折扣问题的贪心解法
<编程之美>读书笔记(四):卖书折扣问题的贪心解法 每次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话, ...
- [Leetcode 376]摇摆序列 Wiggle Subsequence
[题目] A sequence of numbers is called a wiggle sequence if the differences between successive numbers ...
- 贪心:Wiggle Subsequence 摇摆序列
一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,则该序列被称为 摇摆序列.一个小于2个元素的序列直接为摇摆序列.给一个随机序列,求这个序列满足摇摆序列定义的最长子序列的长度: 输入[1,1 ...
- ICG游戏:尼姆游戏异或解法的证明
描述: 尼姆博奕(Nimm Game),有n堆石子,每堆石子有若干石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限.取走最后石子的人获胜. 标准解法: 判断: 先计算先手是必胜还是 ...
- LeetCode Wiggle Subsequence(动态规划)
问题:给出一个数组,求波动序列的最大长度. 思路:方法一使用up(i)表示第i个元素是上升时最大长度,down(i)表示第i个元素是下降时最大长度.则有up(i)=max(down(j) +1, up ...
最新文章
- python实现案例_基于Python实现相关分析案例
- 闭包造成的内存泄露怎么解决?
- 软件工程第八次作业——例行报告
- java webservice soap请求_使用Java对WebService的SOAP请求
- oracle删除数据释放表空间流程
- 字节工程师薪资排世界第五,中位数 43 万美元,2021 全球程序员收入报告出炉!...
- 使用WebStorm/IDEA开发调试Vue/Webpack工程项目
- 实验3:视频播放小程序
- 性能测试tps上不去,又是redis的坑,说多了都是泪啊
- 2024考研《艺术学概论》彭吉象|复习笔记(下篇)(7-12章)
- 分布式链路追踪opentracing-go jaeger小示例
- 社团招新如何吸引新人,制作一张好的海报最关键
- SAP Enhancement 分类
- 总结2019大前端开发十大战略性技术布局
- QT使用MSVC编译时报错C2001: 常量中有换行符
- win7计算机建立无线网络连接不上,win7无线网络显示❌,win7连不上无线网显示红叉...
- 贝叶斯优化: 一种更好的超参数调优方式
- 【大学物理·光学】薄膜干涉
- 机器人 郑佳佳_浙大硕士造了个充气娃娃 和她结婚了
- Android:Android系统中安装的数据文件夹在哪个位置,如何删除wps下载下来的文件