目录
一:问题描述
分发饼干问题是一个经典的可以使用贪心算法解决的问题,问题描述如下:
有一群孩子和一堆饼干,每个孩子都有一个胃口值 g[i]
(表示该孩子需要的饼干的最小尺寸才能满足),每个饼干都有一个尺寸 s[j]
。目标是尽可能让更多的孩子得到满足,即找到能满足的孩子的最大数量。也就是说,要将饼干分配给孩子,当且仅当饼干的尺寸大于或等于孩子的胃口值时,这个孩子才能被满足。(每个孩子最多一块饼干)
二:解决思路
贪心策略(C语言)算法复习总结3——贪心算法-CSDN博客
贪心策略是优先满足胃口值小的孩子。因为对于胃口值小的孩子,更容易找到合适尺寸的饼干来满足他,这样可以尽量让更多的孩子得到满足。具体步骤如下:
- 对孩子的胃口值数组
g
和饼干尺寸数组s
分别进行排序(升序)。 - 用两个指针分别遍历孩子数组和饼干数组。
- 从胃口值最小的孩子开始,尝试用最小尺寸的饼干去满足他。如果当前饼干的尺寸大于或等于当前孩子的胃口值,那么这个孩子就被满足,两个指针都向后移动一位;如果当前饼干的尺寸小于当前孩子的胃口值,说明这个饼干不能满足这个孩子,只能尝试下一个更大尺寸的饼干,即只移动饼干数组的指针。
- 重复步骤 3,直到遍历完所有孩子或者所有饼干。
三:代码实现
#include <stdio.h>
#include <stdlib.h>
// 比较函数,用于 qsort 排序
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
// 解决分发饼干问题的函数
int findContentChildren(int* g, int gSize, int* s, int sSize) {
// 对孩子的胃口值数组和饼干尺寸数组进行排序
qsort(g, gSize, sizeof(int), compare);
qsort(s, sSize, sizeof(int), compare);
int child_index = 0;
int cookie_index = 0;
// 遍历孩子和饼干数组
while (child_index < gSize && cookie_index < sSize) {
if (s[cookie_index] >= g[child_index]) {
// 当前饼干能满足当前孩子,孩子和饼干指针都后移
child_index++;
cookie_index++;
} else {
// 当前饼干不能满足当前孩子,只移动饼干指针
cookie_index++;
}
}
return child_index;
}
int main() {
int g[] = {1, 2, 3};
int s[] = {1, 1};
int gSize = sizeof(g) / sizeof(g[0]);
int sSize = sizeof(s) / sizeof(s[0]);
int result = findContentChildren(g, gSize, s, sSize);
printf("能满足的孩子数量是: %d\n", result);
return 0;
}
四:复杂度分析
- 时间复杂度:排序操作的时间复杂度为 (O(n log n + m log m)),其中 n 是孩子的数量,m 是饼干的数量。遍历数组的时间复杂度为 (O(min(n, m)))。所以总的时间复杂度为 (O(n log n + m log m))。
- 空间复杂度:
qsort
函数通常需要 (O(log n + log m)) 的额外空间,因此总的空间复杂度为 (O(log n + log m))。