【代码随想录训练营】【Day31】第八章|贪心算法|理论基础|455.分发饼干|376. 摆动序列|53. 最大子序和

理论基础

贪心算法是没有规律的,解题过程基本就是模拟,其整体的解题思想就是将一个大问题拆解成一个个小问题,当对每一个小问题都求出最优解后,其整体一个大问题就得到了最优解

基本贪心的题目要么特简单,要么死活想不出来,所以也不用花心思去研究其规律,没有思路就立刻看题解。

学完贪心之后再去看动态规划,就会了解贪心和动规的区别。

总结自:《代码随想录》— 贪心算法 - 理论基础


分发饼干

题目详细:LeetCode.455

这道题比较简单,思路讲起来也比较口语化。

要想饼干尽可能的满足更多数量的孩子,那么只要将孩子的胃口和饼干的大小进行排序,然后从胃口小的孩子开始分发饼干,使他们都能够用尽可能小的饼干就满足了胃口,接着统计分发过程中满足的孩子数量即可。

所以回到贪心算法的思想上来讲:

  • 局部最优:尽可能小的饼干能够满足胃口尽可能小的孩子,满足则数量 + 1
  • 整体最优:所有的饼干都能够尽可能的满足孩子的胃口,统计满足的数量

Java解法(贪心,模拟):

class Solution {
   
   
    public int findContentChildren(int[] g, int[] s) {
   
   
        Arrays.sort(g);
        Arrays.sort(s);
        int g_index = 0, s_index = 0, count = 0;
        while(g_index < g.length && s_index < s.length){
   
   
            if(g[g_index] <= s[s_index]){
   
   
                count++;
                g_index++;
            }
            s_index++;
        }
        return count;
    }
}

摆动序列

题目详细:LeetCode.376

这道题在做题的时候,与其说是贪心算法,不如说是一道模拟题,详细的题解可查阅:《代码随想录》— 摆动序列

主要的难点在于判断数字是否摆动,有三种情况:

  • 情况一:数组首尾两端
  • 情况二:上下坡中有平坡
  • 情况三:单调坡中有平坡

对于情况一:

  • 题目默认数组首位两端为顶点
  • 所以即使数组长度为1,其摆动序列长度也最小为1
  • 那么我们只需要在计算出摆动的总次数 + 1,即可得到摆动序列的最大长度,这里我初始化总次数变量 count = 1,效果也是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值