Leetcode刷题Day31---------------------------贪心算法

Leetcode刷题Day31---------------------------贪心算法

1. 理论基础
  • 文章链接:
    https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
  • 题目链接:https://leetcode.cn/problems/assign-cookies/
  • 视频链接:https://www.bilibili.com/video/BV1WK4y1R71x/?spm_id_from=333.788&vd_source=1fb98c05c7fbfd06713f014ea5079d5b

局部最优 推出 全局最优

2. 455.分发饼干

重点

  1. 胃口一定要在外层循环,饼干在里层循环**
  2. 可以让大饼干先满足胃口大的小孩,也可以让小饼干先满足胃口小的小孩
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int index=s.length-1;//饼干的序列
        int count=0;
        for(int i=g.length-1;i>=0;i--){//胃口的序列
            if(index>=0&&g[i]<=s[index]){//要先写饼干序列>=0
                index--;
                count++;
            }
        }
        return count;
    }
}
3. 376. 摆动序列
  • 题目链接:https://leetcode.cn/problems/wiggle-subsequence/
  • 文章链接:https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html
  • 视频链接:https://www.bilibili.com/video/BV17M411b7NS/?spm_id_from=333.788&vd_source=1fb98c05c7fbfd06713f014ea5079d5b
  1. 上下破有平坡------------主要的逻辑,记得破度可以为0
  2. 首尾-------------首部:造首,和第一个元素一样;尾部:默认有一个摆动 -> result=1开始
  3. 单调
class Solution {
    public int wiggleMaxLength(int[] nums) {
        if(nums.length==0) return 0;
        int preDiff=0;
        int curDiff=0;
        int result=1;   //初始的result要从1开始
        for(int i=1;i<nums.length;i++){//i从1循环即可 
            curDiff=nums[i]-nums[i-1];
            if(curDiff<0&&preDiff>=0||curDiff>0&&preDiff<=0){   //prediff 可能等于0,表示初始的状态
                result++;
                preDiff=curDiff;
            }
        } 
        return result;       
    }
}
4. 53. 最大子序和
  • 题目链接:https://leetcode.cn/problems/maximum-subarray/
  • 文章链接:https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.html
  • 视频链接: bilibili.com/video/BV1aY4y1Z7ya/?spm_id_from=pageDriver&vd_source=1fb98c05c7fbfd06713f014ea5079d5b

解题关键:

  1. 当和为负数时,要丢弃掉,重新开始加,因为,只有一直加正数,和才会逐渐变大。
  2. 要有两个变量,count和sum。sum初始值是系统最小,为了记录当数组里都为负时的值。
class Solution {
    public int maxSubArray(int[] nums) {
        if(nums.length==1) return nums[0]; 
        int count=0;
        int sum=Integer.MIN_VALUE;   //sum初始wei0
        for(int i=0;i<nums.length;i++){
            count+=nums[i];
            sum=Math.max(count,sum);  //sum赋值为count和sum里的最大值
            if(count<=0) count=0;
        }
        return sum;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值