「这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战」。
分发饼干
题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子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.
算法描述
这道题目实质上就是贪心算法
的实现,在解题之前我们先来看一看贪心算法的一些相关概念吧!
贪心算法的定义:
顾名思义,贪心算法总是做出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。
回到本题中,对于每个孩子来说都有一个胃口值,每块饼干都有一个尺寸值。
本题中提出的要求是将饼干分配给孩子尽可能满足越多数量的孩子,当然这个饼干的尺寸值一定要符合胃口值,这就相当于尺寸值必须不能小于胃口值。
我们利用贪心算法来解决这道题,首先将胃口值数组和饼干尺寸数组排序,然后从胃口值出发,我们优先考虑胃口值,先喂饱大胃口的,即从后向前遍历,然后按照胃口值从大到小依次分发饼干,统计孩子的数量。
代码描述
class Solution {
public int findContentChildren(int[] g, int[] s) {
//将胃口值数组和饼干尺寸数组排序
Arrays.sort(g);
Arrays.sort(s);
//定义饼干尺寸数组下标,从最右边开始,即数组中的最大值
int start=s.length-1;
//定义孩子的数量,初始值为0
int count=0;
//将胃口值从后往前遍历
for(int i=g.length-1;i>=0;i--){
//当胃口值不小于饼干的尺寸值时,说明符合分发条件,开始分发,孩子的数量加1
//然后继续向左遍历,进行同样的判断和操作,直到循环结束。
if(start>=0&&g[i]<=s[start]){
start--;
count++;
}
}
//统计孩子的数量
return count;
}
}