分发饼干
有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有大小。每个孩子最多只能吃一个饼干,且只有饼干的大小大于等于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子可以吃饱。
示例1
输入:children = [1, 2, 3], cookies = [1, 1]
输出:1
解释:有三个孩子和两块饼干,3个孩子的饥饿度分别是1, 2, 3。虽然有两块饼干,由于它们的大小都是1,只能让饥饿度是1的孩子满足。所以应该输出1。
互动实验
分发饼干:最小的足够大的饼干
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
示例2
输入:children = [1, 2], cookies = [1, 2, 3]
输出:2
解释:有两个孩子和三块饼干,2个孩子的饥饿度分别是1, 2。拥有的饼干数量和大小都足以让所有孩子满足。所以应该输出2。
因为饥饿度最小的孩子最容易吃饱,所以先考虑这个孩子。为了尽量使得剩下的饼干可以满足饥饿度更大的孩子,所以应该把大于等于这个孩子饥饿度的、且大小最小的饼干给这个孩子。满足了这个孩子之后,采取同样的策略,考虑剩下孩子里饥饿度最小的孩子,直到没有满足条件的饼干存在。
这里的贪心策略是,给剩余孩子里最小饥饿度的孩子分配最小的能饱腹的饼干。因为需要获得大小关系,一个便捷的方法就是把孩子和饼干分别排序,这样就可以从饥饿度最小的孩子和大小最小的饼干出发,计算有多少个孩子可以吃饱。
知识测验
题目
饼干小于当前最小饥饿度时,应该移动哪个指针?
互动实验
分发饼干:最小的足够大的饼干
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
C
#include <stdio.h>
#include <stdlib.h>
static int cmp(const void *p1, const void *p2) {
int *num1 = (int *)p1;
int *num2 = (int *)p2;
return (*num1 > *num2) - (*num1 < *num2);
}
int distribute(int *children, int children_num, int *cookies, int cookies_num) {
qsort(children, children_num, sizeof(children[0]), cmp);
qsort(cookies, cookies_num, sizeof(cookies[0]), cmp);
int child = 0;
int cookie = 0;
while (child < children_num && cookie < cookies_num) {
if (children[child] <= cookies[cookie]) {
child++;
}
cookie++;
}
return child;
}
int main(void) {
int children[] = {1, 2};
int children_num = sizeof(children) / sizeof(children[0]);
int cookies[] = {1, 2, 3};
int cookies_num = sizeof(cookies) / sizeof(cookies[0]);
printf("%d\n", distribute(children, children_num, cookies, cookies_num));
return 0;
}知识测验
题目
children=[2,3],cookies=[1,3],最多满足几个孩子?
动手练习
分配新的饼干序列
孩子饥饿度
02
13
25
饼干大小
01
12
24
35
按最小足够饼干的策略分配,标出跳过的饼干、每次分配和双指针的移动,求最多满足的人数。