代码随想录刷题记录day28 贪心 分发饼干+摆动序列+最大子数组和

本文介绍了三种使用贪心算法解决的编程问题:455.分发饼干,通过贪心策略将最小饼干优先分配给合适的孩子;376.摆动序列,通过寻找单调区间确定摆动序列的长度;53.最大子数组和,利用贪心思想找到数组中连续子数组的最大和。通过实例解析了贪心算法的逻辑和应用。
摘要由CSDN通过智能技术生成

代码随想录刷题记录day28 贪心 分发饼干+摆动序列+最大子数组和

参考:代码随想录

贪心理论基础

局部最优推出全局最优

一般步骤:

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

没有固定的套路,一般都是通过举反例来推导。

455. 分发饼干

在这里插入图片描述

思想

贪心:

将最小的饼干先分发给胃口刚好小于等于此饼干大小的孩子。

需要先排序,然后遍历饼干大小,进行分发记录。

代码
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        //g 表示孩子的胃口  s表示饼干的大小
        //饼干分给 胃口大小<=饼干大小
        if(s.length==0) return 0;
        int count=0;
        Arrays.sort(g);
        Arrays.sort(s);
        int g_index=0;
        for(int i=0;i<s.length;i++){
            //遍历所有的饼干数量
            if(g_index<g.length && s[i]>=g[g_index]){
                count++;
                g_index++;
            }
        }
        return count;
    }
}

376. 摆动序列

在这里插入图片描述

思想

贪心:

寻找极值,极大值和极小值,中间递增或者递减的过滤即可。

怎么样判断是找到了极值点呢?通过差值preDiff前两个数的差值, curDiff当前两个数的差值

  • 如果preDiff<=0 curDiff>0 比如: 2 1 3 preDiff =-1,curDiff=2
  • 如果preDiff>=0 curDiff<0 比如: 1 2 1 preDiff =1,curDiff=-1
class Solution {
    public int wiggleMaxLength(int[] nums) {

        //统计出现极值的情况
        if(nums.length==1) return 1;

        int preDiff=0;//之前的差值
        int curDiff=0;//当前的差值
        int res=1;//默认从1开始 表示最右边的峰

        for(int i=1;i<nums.length;i++){
            curDiff=nums[i]-nums[i-1];
            if(preDiff<=0 && curDiff>0  || preDiff>=0 && curDiff<0){
                res++;
                preDiff=curDiff;
            }
        }

        return res;
    }
}

53. 最大子数组和

在这里插入图片描述

思想

用一个count来记录连续数组的和,一旦count<0 就令count从0开始计数, -2 1 是要从1开始计数的。

同时用res来记录最大的连续数组的和。

时间复杂度是 O(n) 空间复杂度是O(1)

代码
class Solution {
    public int maxSubArray(int[] nums) {
        //连续数组的最大和
        //贪心算法
        int count=0;
        int res=Integer.MIN_VALUE;

        for(int i=0;i<nums.length;i++){
            count+=nums[i];
            if(count>res){
                res=count;
            }
            if(count<=0) count=0;//重新开始计数
        }

        return res;

    }
}

总结

贪心的逻辑是想不到呀。不想递归 回溯 有一个具体的模板,主要思路就是局部最优 得到全局最优。

分发饼干想到了,但是代码也没写不好。

摆动序列的单调区间

最大子数组和的count累加

继续坚持呀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值