持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情🚀🚀
前言
开始进入贪心专题了,难度要越来越大了~
455. 分发饼干 - 力扣(LeetCode)
代码实现
var findContentChildren = function(g, s) {
g.sort((a,b) => a-b)
s.sort((a,b) => a-b)
let index = s.length-1;
let count = 0;
for(let i = g.length-1; i >= 0 ; i--){
if(s[index] >= g[i] ){
count ++ ;
index --;
}
}
return count;
};
难点
-
在哪体现了贪心?
这里为什么
大饼干
喂给胃口大
的才是贪心呢?可以试着这样想,
大饼干
如果可以满足胃口大
的,那么也可以满足胃口小
的,如果将大饼干
满足胃口小
的,那么胃口大
的怎么办??咋感觉有点像田忌赛马呢~
-
怎么样通过代码实现大饼干喂给胃口大的呢?
这一块代码上手能力不足,但真的不难。
376. 摆动序列 - 力扣(LeetCode)
代码实现
var wiggleMaxLength = function(nums) {
let count = 1;
let prediff = 0;
let curdiff = 0;
for(let i = 0; i < nums.length;i++){
curdiff = nums[i] - nums[i-1]
if((curdiff>0 && prediff <= 0) || (curdiff < 0 && prediff >= 0)){
count++;
prediff = curdiff;
}
}
return count;
};
难点
- 试着将代码可视化?
我发现如果将代码画了按卡哥这样画了图的话,思路会异常清晰。
-
贪心体现在哪?
局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。
整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。
这是卡哥的说法,肯定是没错的,但我还是觉得这道题以及后面那道真的不是很明显地去体现出贪心。
-
prediff = curdiff;
这一步自己总想不到,但如果没有这一环,后续判断也就链接不起来。
53. 最大子数组和 - 力扣(LeetCode)
代码实现
var maxSubArray = function(nums) {
let res = -Infinity;
let count = 0;
for(let i = 0;i < nums.length ; i++){
count += nums[i] ;
if(count > res)
res = count;
if(count < 0)
count = 0
}
return res
};
难点
-
贪心体现在哪?
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
全局最优:选取最大“连续和”
在代码中体现
if(count < 0) count = 0
-
这题没那么难
自己刚刚想这题的时候,想法异常的复杂,滑动窗口都想了,结果一看题解,暴力都能写的出。。