455 分发饼干
思路:代码随想录
思路:贪心没有套路。每一题可能都不一样。所以本题,我们的局部最优就是拿大饼干去喂胃口大的小孩。最终推出全局最优。2个数组需要先排序。
376 摆动序列
思路:代码随想录
思路:数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
贪心思路:遇到摆动我们计数器++。
但本题要考虑三种情况:
- 情况一:上下坡中有平坡
- 情况二:数组首尾两端
- 情况三:单调坡中有平坡
情况 1:例如 [1,2,2,2,1]这样的数组
当 i 指向第一个 2 的时候,prediff > 0 && curdiff = 0
,当 i 指向最后一个 2 的时候 prediff = 0 && curdiff < 0
。
如果我们采用,删左面三个 2 的规则,那么 当 prediff = 0 && curdiff < 0
也要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。
所以我们记录峰值的条件应该是: (preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)
,为什么这里允许 prediff == 0 ,就是为了 上面我说的这种情况
情况2:这里我们可以写死,就是 如果只有两个元素,且元素不同,那么结果为 2。
情况3:
应该什么时候更新 prediff 呢?
我们只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。
53.最大子数组和
思路:代码随想录
思路:
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
全局最优:选取最大“连续和”
局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。
如何放弃连续和呢,只要让连续和等于0 这样在下一个循环就可以重新被赋值。
我们要先判断连续和是不是大于result。以防万一数组里全是负数。这样不会被直接赋值为0