15.分发饼干(easy)

1.题目连接:

942. 增减字符串匹配 - 力扣(LeetCode)942. 增减字符串匹配 - 由范围 [0,n] 内所有整数组成的 n + 1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中: * 如果 perm[i] < perm[i + 1] ,那么 s[i] == 'I'  * 如果 perm[i] > perm[i + 1] ,那么 s[i] == 'D' 给定一个字符串 s ,重构排列 perm 并返回它。如果有多个有效排列perm,则返回其中 任何一个 。 示例 1:输入:s = "IDID"输出:[0,4,1,3,2]示例 2:输入:s = "III"输出:[0,1,2,3]示例 3:输入:s = "DDI"输出:[3,2,0,1] 提示: * 1 <= s.length <= 105 * s 只包含字符 "I" 或 "D"https://leetcode.cn/problems/di-string-match/description/2.题目描述:

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。    对每个孩子 i ,都有一个胃口值 g[i] (,)这是能让孩子们满足胃口的饼干的最小尺寸;并且每块    饼干 j ,都有一个尺寸 s[j] ( )。如果 s[j] >= g[i] ,我们可以将这个饼干 j  分配给孩子

i  ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。​ ​
示例 1:​
  输入: g = [1,2,3], s = [1,1]​
  输出: 1​
  解释: ​
  你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。​
  虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。​  所以你应该输出1。​
示例 2:​
  输入: g = [1,2], s = [1,2,3]​
  输出: 2​
  解释: ​
  你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。​
  你拥有的饼干数量和尺寸都足以让所有孩子满足。

所以你应该输出2.​
 ​
提示:

1 <= g.length <= 3 * 10(4)

0 <= s.length <= 3 * 10(4)

1 <= g[i], s[j] <= 2(31) - 1

3. 解法(贪心):
(既然是很棒的家长,为什么不多买一些饼干呢(#狗头))贪心策略:
        先将两个数组排序。

针对胃口较小的孩子,从小到大挑选饼干:
i.      如果当前饼干能满足,直接喂(最小的饼干都能满足,不要浪费大饼干);
ii. 如果当前饼干不能满足,放弃这个饼干,去检测下一个饼干(这个饼干连最小胃口的孩子都              无法满足,更别提那些胃口大的孩子了)。

Java算法代码:

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        //先排序
        Arrays.sort(g);
        Arrays.sort(s);

        //利用双指针找答案
        int ret = 0, m = g.length, n = s.length; 
        for(int i = 0, j = 0; i < m && j < n; i++, j++){
            while(j < n && s[j] < g[i]) j++; // 找饼干
            if(j < n) ret++;
        }
        return ret;
    }
}

运行结果:

贪心策略:

贪心策略的体现
  • 优先用最小的饼干(s[0] = 1)满足最小的孩子(g[0] = 1)。
  • 用稍大的饼干(s[1] = 2)满足下一个孩子(g[1] = 2)。
  • 这样确保了饼干的高效利用,最大化满足的孩子数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值