376. 摆动序列
贪心题还是挺麻烦的,至少我知道方法,但是没写出来(用Carl的话说就是:知道题目方法是常识性的东西,但是代码实现困难)
贪心主要方法:手动模拟方法,感觉可行,就试一试
难点1:如何设置寻找差值
有n个数,但是差值只有n-1个,怎么找呢。解决办法是在首部设置一个跟nums[0]相等的虚拟的数,然后就可以从第1个数开始算差值进行比较
1 | class Solution { |
难点2:为什么是prediff <= 0? 这个问题我认为应该分开来思考成两种情况,< 0就不说了,一正一负很好理解。
问题是为什么等于零?为什么cur 不等于0,pre可以等于0?题目不是要求一正一负吗?这个问题应该这样思考,pre为0,cur不为零,那么证明此时cur这个点是峰值(低谷)的。反过来,如果cur==0, pre != 0,那就是说当前元素cur跟前一个元素重复了,所以就不对了,这个解法中的pre只会在开始为0,后面pre的取值由cur更新,而cur == 0是不满足if条件的。换句话说,如果数组中有重复元素,它只会取第一个,这也是这个算法的巧妙性
还有一个y总的代码也挺好的,下次更新吧
53. 最大子序和
贪心解法
每次求值都进行选择,是当前的值【num[i]】更好还是【sum+num[i]】更好,局部最优形成全局最优
1 | class Solution { |
动态规划
核心公式差不多
1 | class Solution { |
122. 买卖股票的最佳时机 II
这题有一个误区,就是我能不能在同一天卖,然后再买。题目没说,那就应该是可以的。所以贪心的思路也就出来了,检查每两天的股票差值,是正值就买入,是负值就跳过,从局部最优到全局最优
1 | class Solution { |
55. 跳跃游戏
贪心题就是难想出来,代码其实挺简单的,这种题最重要的锻炼贪心思维
具体来说就是判断最大覆盖范围,如果在覆盖范围内就更新maxStep,最后结果就出来了
1 | class Solution { |
结尾
今天终于提起刷题的欲望了,但都是简单题?麻了,学计网去,等书到了开始更新计网的笔记,这种纯理论的东西就是记着玩,就是玩。