目录
1 贪心算法:
保证每次局部操作是最优解,从而是最终得到的结果是全局最优解。
2 题目描述
有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃
一个饼干,且只有饼干的大小不小于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子
可以吃饱。
输入输出样例
输入两个数组,分别代表孩子的饥饿度和饼干的大小。输出最多有多少孩子可以吃饱的数
量。
Input: [1,2], [1,2,3]
Output: 2
3 解题思路
每次用最小的饼干,分配给最不饿的小孩,达到资源的最大利用率,贪心策略是:给剩余孩子里面最小饥饿度的孩子分配最小的能饱腹的饼干。
具体步骤:
- 从小到大排序孩子和饼干;
- 用两个指针遍历孩子和饼干,满足了孩子,则孩子指针和饼干指针都往后,不满足,则饼干指针往后找更大饼干。
4 c++
执行用时:20 ms, 在所有 C++ 提交中击败了95.87%的用户
内存消耗:17 MB, 在所有 C++ 提交中击败了91.29%的用户
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
// 排序
sort(g.begin(), g.end()); // 逆序rbegin()
sort(s.begin(), s.end());
// 遍历孩子和饼干
// 两个指针分别指针有序的孩子和有序的饼干
int child_idx = 0;
int cooky_idx = 0;
while (child_idx < g.size() && cooky_idx < s.size())
{
if (g[child_idx] <= s[cooky_idx]) // 当前孩子的胃口小于当前的饼干大小
{
child_idx++; // 下一个孩子
cooky_idx++; // 下一饼干
}
else // 饼干小了
{
cooky_idx++; // 找更大饼干
}
}
return child_idx;
}
};
5 python
执行用时:36 ms, 在所有 Python 提交中击败了82.72%的用户
内存消耗:13.9 MB, 在所有 Python 提交中击败了84.74%的用户
class Solution(object):
def findContentChildren(self, g, s):
"""
:type g: List[int]
:type s: List[int]
:rtype: int
"""
# 排序
g = sorted(g)
s = sorted(s)
# 两个指针,分别指向有序孩子,和有序饼干
child_idx = 0
cooky_idx = 0
# 遍历孩子和饼干,满足了孩子,则孩子指针和饼干指针都往后,不满足,则饼干指针往后找更大饼干。
while child_idx < len(g) and cooky_idx < len(s):
if g[child_idx] <= s[cooky_idx]:
child_idx += 1 # 分配,下一个孩子
cooky_idx += 1 # 下一个饼干
else:
cooky_idx += 1 # 找更大饼干
# 要么孩子遍历完了,则全部吃饱,要么饼干分配完了。
return child_idx