LeetCode 455简单贪心
分发饼干 图解题解
这道题到底在问什么
给孩子们分饼干。每个孩子 i 有胃口值 g[i],每块饼干 j 有尺寸 s[j]。如果 s[j] >= g[i],这块饼干可以让孩子 i 满足。每个孩子最多只能给一块饼干,每块饼干也只能用一次。请返回最多可以满足的孩子数量。
- 输入
- g = [1,2,3], s = [1,1]
- 输出
- 1
- 解释
- 两块饼干尺寸都是 1,只能满足胃口为 1 的孩子。
- 输入
- g = [1,2], s = [1,2,3]
- 输出
- 2
最优解:一步一步想明白
- 3这题的关键是先排序,让“当前最容易满足的孩子”和“当前最小的饼干”可以直接比较。
- 4不够当前最小胃口孩子的饼干,也不可能满足后面胃口更大的孩子。
- 5g.sort(); s.sort(); i = 0主行展示排序后的饼干 s;变量面板固定展示孩子胃口 g 和当前孩子 g[i]。i 表示已经满足了多少个孩子,也表示下一个孩子下标。
- 6for cookie in s:高亮的是当前扫描到的饼干 s[0]。每一轮只问:当前这块最小可用饼干,能不能满足当前最小胃口孩子。
- 7cookie = 1; cookie >= g[i]s[0] 被标为已匹配:最小饼干 1 正好满足最小胃口 1。用掉它后,i=1,下一位孩子的胃口是 2。
- 8cookie = 1; cookie < g[i]s[1] 被置灰表示跳过。它连当前最小胃口孩子都不够,更不可能满足后面的孩子,所以 i 不移动。
- 9cookie = 2; cookie >= g[i]尺寸 2 的饼干刚好满足胃口 2 的孩子。继续把更大的饼干留给后面的孩子。
- 10cookie = 3; cookie >= g[i]最后一块饼干满足胃口 3 的孩子。此时 i=3,三个孩子都已满足。
- 11i < len(g) 为 False如果后面还有饼干,条件 i < len(g) 会阻止继续访问 g[i]。这里已经没有孩子需要满足。
- 12return ii 的含义一举两得:既是下一个孩子下标,也是当前已经满足的孩子数量。
- 15排序以后,每次局部选择都不会伤害未来,因为后面的孩子胃口只会更大。
⚠️ 容易写错的地方
✗ 错:不排序直接匹配
✓ 对:先排序孩子和饼干
不排序时,小饼干和小胃口无法稳定配对,容易浪费大饼干。
✗ 错:饼干不够时移动孩子指针
✓ 对:饼干不够只跳过饼干
当前孩子还没被满足,不能跳到下一个孩子。
✗ 错:忘记 i < len(g)
✓ 对:判断时先确认还有孩子
孩子都满足后再访问 g[i] 会越界。
完整代码(Python)
Python
class Solution:
def findContentChildren(self, g, s):
g.sort()
s.sort()
i = 0
for cookie in s:
if i < len(g) and cookie >= g[i]:
i += 1
return i复杂度
时间复杂度
O(n log n + m log m)
n 是孩子数量,m 是饼干数量,主要开销来自两次排序。
空间复杂度
O(1)
除排序实现内部开销外,只使用 i 等常数变量。
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 分发饼干 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
这道题为什么用「贪心」,换最直接的暴力解会差在哪?+
贪心抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
时间复杂度为什么是 undefined?怎么推出来的?+
按上文复杂度小节的推导,时间复杂度为 undefined。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。