✅✅代码随想录算法训练营Day31 || 455.分发饼干 376. 摆动序列 53. 最大子序和

85 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情🚀🚀

前言

开始进入贪心专题了,难度要越来越大了~

455. 分发饼干 - 力扣(LeetCode)

image.png

代码实现

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)

image.png

代码实现

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;
};

难点

  • 试着将代码可视化?

image.png

我发现如果将代码画了按卡哥这样画了图的话,思路会异常清晰。

  • 贪心体现在哪?

    局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值

    整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列

    这是卡哥的说法,肯定是没错的,但我还是觉得这道题以及后面那道真的不是很明显地去体现出贪心。

  • prediff = curdiff;

    这一步自己总想不到,但如果没有这一环,后续判断也就链接不起来。

53. 最大子数组和 - 力扣(LeetCode)

image.png

代码实现

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

  • 这题没那么难

    自己刚刚想这题的时候,想法异常的复杂,滑动窗口都想了,结果一看题解,暴力都能写的出。。