今天结束了回溯算法长久的折磨,才发现贪心算法更折磨。简单的很简单,难得也很难。
第一题:
简介:
本题的贪心思想是如何用最少的饼干满足最多的人。刚开始使用两个排序是为了让两个数组都从最小的开始,最小胃口的人获得最小的饼干,一次类推。这样能满足最大的人。
代码实现:
优化:
两种优化无非是一个从前遍历,一个从后遍历。思路无太大差别,贪心的题终极思想就是要搞明白贪心贪在哪。想清楚局部最优,想清楚全局最优,从局部最优推出全局最优 。
第二题:
简介:
大家可以去看代码随想录的解析很详细,也可以听听我的想法。我认为主要的思想是判断峰值,如果有高峰或者低谷就将最后结果+1。刚开始我做这道题时是判断符合差为正负正负的规律就可以将此数加入进来。但是我忽略了一个问题以下图为例
我们看从5 -- 15这一坡度,按我的思路10这个数会被添加进去,然而10并不是坡顶,所以会出现如果下一个低谷的值大于10这个数那么就会错过这个谷底,结果就不对了。 如下图:
10加入进去下一个谷底12因为比10大所以不会加入进去,所以就会产生错误。所以我们要想的是我们要加入数组的值应该是整个坡度的两端这样就不会产生刚才的问题。所以,我们贪心的思想为
局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。
整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。然后我们可以开始写代码了。
curpef:当前一对差值
prepef:前一对差值
result:用于记录有多少峰值
如果这样就可以判断是峰值或低谷,同时我们不会像前面一样丢掉某个坡顶或谷底因为
我们 不是 不断更新prepef的而是每当到达坡顶或者谷底时才会出现更新,这样就保证了我们的思想,只记录坡顶或谷底的点。这样不管是有平坡还是无平坡 我们记录的都会是坡顶或谷底的值,这样我们就解决了
两种情况,那为什么我们会有让prepef=0的条件呢。是因为如果是第一次遍历我们设置的prepef为0,所以要让第一次遍历进入更新中。然后就不断便利。然后最后return时我们要加1,因为我们开始遍历时记录的是第一个坡顶或者谷底的节点,起始节点没有被记录进去,所以我们要加1,作为最终结果。也解决了数组只有两个数时的问题
这种问题。
代码实现:
还有动态规划的做法,等到动态规划章节我再说。
第三题:
简介:
本题贪心思想:
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
全局最优:选取最大“连续和”
本题我认为要理解好为什么是连续和为负数时要舍弃,而不是当前元素为负数时舍弃。理解了这一点我认为此题不难。
代码实现:
总结:
今天第一次接触贪心思想,有点意思。不过只独立做出了一道题,第二题自己的思路的致命错误在看题解时想出来了,继续加油吧!!【擦汗】。