代码随想录算法训练营第三十一天 _ 贪心算法_455.分发饼干、376. 摆动序列、53. 最大子序和。

学习目标:

贪心算法中的贪心指的是局部最优
贪心算法就是直觉可以接受就行,不要求严格的数学证明。不合适的条件设置用反证法证明不适用就行。
贪心算法相关的题目做的很不舒服,可能是因为我不贪心吧,更可能是因为没有任何的规律性;总是感觉一知半解的,就很迷茫。

60天训练营打卡计划!

学习内容:

455.分发饼干

  • 最外层循环一定是胃口,因为如果胃口太大会一直递减到合适的胃口
    就有些奇怪,但是只能强迫自己接受。
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        // 由胃口找饼干
        int index = s.length - 1;
        int res = 0;
        // 最外层循环一定是胃口,因为如果胃口太大会一直递减到合适的胃口
        // 不能严格的要求证明,只要能举出最外层是饼干的错误情况就可以。
        for(int i = g.length - 1; i >= 0; i--){
            if(index >= 0 && g[i] <= s[index]){
                res++;
                index--;
            }
        }
        return res;
    }
}

376. 摆动序列

  • 不知道该总结什么规律
  • 勉强可以归类到双指针里。
class Solution {
    public int wiggleMaxLength(int[] nums) {
        int size = nums.length;
        // 我更喜欢把特殊的情况写到上面
        if(size == 1 || (size == 2 && (nums[0] == nums[1])))    return 1;
        if(size == 2 && (nums[0] != nums[1]))    return 2;

        int prediff = nums[1] - nums[0];
        int curdiff = 0;
        int res = prediff == 0 ? 1 : 2;
        // 也可以视为双指针法,curdiff和prediff
        // 当且仅当出现转折点时,才更新prediff
        for(int i = 1; i < size - 1; i++){
            curdiff = nums[i + 1] - nums[i];
            // 判断条件应该一致,等号应该给同一个diff。
            if((prediff >= 0 && curdiff < 0) || (prediff <= 0 && curdiff > 0)){
                res++;
                prediff = curdiff;
            }
        }
        return res;
    }
}

53. 最大子序和

  • 原则:只要连续和不为负数,则一直累加;只要连续和为负数,舍弃之前的累加和,从新的元素开始求和。
  • 这个就很清晰,很有成就感
class Solution {
    public int maxSubArray(int[] nums) {
        int max = Integer.MIN_VALUE;
        int res = 0;
        for(int i = 0; i < nums.length; i++){
            if(res < 0){
                res = 0;
            }
            res += nums[i];
            max = max > res ? max : res;
        }
        return max;
    }
}

学习时间:

  • 上午半小时,下午两个半小时,整理文档半小时。
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值