news 2026/4/13 13:53:35

LeetCode 455 - 分发饼干

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 455 - 分发饼干


文章目录

    • 摘要
    • 描述
    • 题解答案(核心思路)
      • 贪心策略怎么定?
      • 为什么这个策略是对的?
    • 题解答案(Swift 可运行 Demo)
    • 题解代码分析
      • 1. 为什么一定要排序?
      • 2. 双指针的意义
      • 3. 关键判断逻辑
      • 4. 为什么不会漏解?
    • 示例测试及结果
      • 示例 1
      • 示例 2
      • 自定义测试
    • 实际场景结合
      • 1. 资源分配问题
      • 2. 人力与任务匹配
      • 3. 面试中的信号题
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

LeetCode 455 是一道非常经典的贪心入门题

题目本身不复杂,但如果你第一次写,很容易陷入一种纠结:

  • 是不是要给胃口最大的孩子最大的饼干?
  • 要不要试所有组合?
  • 会不会分配错了,后面没法满足更多孩子?

其实这道题的核心只有一句话:

用最小的资源,优先满足最容易满足的人。

一旦想通这一点,代码就会变得非常干净,而且效率也很高。

描述

你有两组数据:

  • g[i]:第i个孩子的胃口值(最小需要多大的饼干)
  • s[j]:第j块饼干的尺寸

规则很简单:

  • 一个孩子最多只能拿一块饼干
  • 一块饼干只能给一个孩子
  • 只有当s[j] >= g[i],这个孩子才会满足

你的目标不是让所有孩子都满足,而是:

尽可能多地满足孩子,返回最大数量

题解答案(核心思路)

贪心策略怎么定?

这道题的贪心策略其实非常直觉化:

  1. 先排序

    • 孩子的胃口从小到大排
    • 饼干的尺寸从小到大排
  2. 用最小的饼干,去尝试满足胃口最小的孩子

  3. 如果当前饼干满足不了这个孩子,那它也一定满足不了胃口更大的孩子,直接丢弃

  4. 如果能满足,就计数 +1,同时换下一个孩子和下一块饼干

为什么这个策略是对的?

因为:

  • 胃口小的孩子选择空间最大
  • 小饼干是“最稀缺”的资源
  • 如果你用大饼干去喂小胃口的孩子,很可能会浪费掉大饼干

这和现实生活其实一模一样。

题解答案(Swift 可运行 Demo)

classSolution{funcfindContentChildren(_g:[Int],_s:[Int])->Int{// 1. 排序letchildren=g.sorted()letcookies=s.sorted()varchildIndex=0varcookieIndex=0varresult=0// 2. 双指针遍历whilechildIndex<children.count&&cookieIndex<cookies.count{ifcookies[cookieIndex]>=children[childIndex]{// 当前饼干可以满足当前孩子result+=1childIndex+=1cookieIndex+=1}else{// 饼干太小,换一块更大的cookieIndex+=1}}returnresult}}

题解代码分析

1. 为什么一定要排序?

letchildren=g.sorted()letcookies=s.sorted()

排序之后有两个好处:

  • 胃口小的孩子排在前面,优先满足
  • 饼干尺寸从小到大,避免浪费大饼干

如果不排序,你就很难保证当前的分配是“最省资源”的。

2. 双指针的意义

varchildIndex=0varcookieIndex=0

这两个指针分别表示:

  • childIndex:当前要尝试满足的孩子
  • cookieIndex:当前拿来用的饼干

指针只往前走,不回退,这也是贪心算法的典型特征。

3. 关键判断逻辑

ifcookies[cookieIndex]>=children[childIndex]
  • 满足:说明这块饼干是“刚刚好或更大”,直接用
  • 不满足:说明这块饼干太小,留着也没用,换下一块

这里有个非常重要但容易忽略的点:

如果当前饼干满足不了当前孩子,那它一定满足不了后面的孩子。

4. 为什么不会漏解?

因为:

  • 每个孩子只会尝试一次
  • 每块饼干只会使用或丢弃一次
  • 没有回头路,但这是正确的回头路不需要走

示例测试及结果

示例 1

letsolution=Solution()print(solution.findContentChildren([1,2,3],[1,1]))

输出:

1

解释过程:

  • 饼干:[1,1]
  • 孩子胃口:[1,2,3]
  • 只能满足胃口为 1 的孩子

示例 2

print(solution.findContentChildren([1,2],[1,2,3]))

输出:

2

解释过程:

  • 饼干足够
  • 每个孩子都能被满足

自定义测试

print(solution.findContentChildren([2,3,4],[1,2,3]))

结果:

2

解释:

  • 胃口 2 用饼干 2
  • 胃口 3 用饼干 3
  • 胃口 4 无法满足

实际场景结合

这道题的思路在真实世界中非常常见。

1. 资源分配问题

  • 带宽分配
  • 内存分配
  • 任务调度

本质都是:

用有限资源,尽量满足更多请求

2. 人力与任务匹配

比如:

  • 初级任务给初级工程师
  • 高难度任务留给高级工程师

如果你反过来分配,很容易“浪费能力”。

3. 面试中的信号题

这道题经常被用来考:

  • 是否理解贪心的正确性
  • 是否能写出简洁、不绕弯的代码
  • 是否能解释为什么这样贪是对的

时间复杂度

  • 排序:O(n log n)
  • 双指针遍历:O(n)

整体时间复杂度:

O(n log n)

空间复杂度

  • 排序需要额外空间(取决于语言实现)
  • 指针变量是常量级

空间复杂度:

O(1)(忽略排序带来的额外空间)

总结

LeetCode 455 是一道非常值得反复体会的贪心题

  • 思路简单
  • 逻辑清晰
  • 非常贴近真实世界的决策方式

如果你能把这道题讲清楚,说明你已经不只是“刷题”,而是在真正理解算法的决策逻辑

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 5:11:32

基于Ubuntu的arm64 x64交叉编译系统搭建

在Ubuntu上构建高效的ARM64与x64交叉编译系统&#xff1a;从零开始的实战指南你有没有遇到过这样的场景&#xff1f;团队手头只有一台高性能的x86_64服务器&#xff0c;却要为树莓派4、NVIDIA Jetson Orin 或者飞腾服务器开发软件。每次上传源码到目标设备编译&#xff0c;不仅…

作者头像 李华
网站建设 2026/4/10 10:50:31

低成本高回报:用消费级显卡跑anything-llm可行吗?

低成本高回报&#xff1a;用消费级显卡跑 anything-LLM 可行吗&#xff1f; 你有没有想过&#xff0c;不用租云服务器、不花几万块买专业显卡&#xff0c;也能在自己的电脑上运行一个能读文档、答问题、像私人AI助理一样的大模型系统&#xff1f;听起来像是科幻片的情节&#x…

作者头像 李华
网站建设 2026/4/2 2:43:35

GPU加速推理实测:在anything-llm中启用CUDA提升性能

GPU加速推理实测&#xff1a;在anything-llm中启用CUDA提升性能从一次文档问答的延迟说起 你有没有过这样的体验&#xff1f;上传了一份几十页的技术文档到本地AI系统&#xff0c;满怀期待地问&#xff1a;“这个项目的交付周期是多久&#xff1f;”结果等了十几秒才看到第一个…

作者头像 李华
网站建设 2026/4/10 19:03:11

【金猿技术展】英方i2Availability——应用高可用管理软件

英方软件技术该技术由英方软件投递并参与金猿组委会数据猿上海大数据联盟共同推出的《2025大数据产业年度创新技术》榜单/奖项评选。大数据产业创新服务媒体——聚焦数据 改变商业本发明一种减少异地容灾平台公网带宽的日志收集方法及装置&#xff0c;该方法包括&#xff1a;通…

作者头像 李华
网站建设 2026/4/11 0:43:05

差分信号布线阻抗匹配:超详细版解析

差分信号布线阻抗匹配&#xff1a;工程师的实战指南你有没有遇到过这样的情况&#xff1f;PCB板子打样回来&#xff0c;系统一上电&#xff0c;高速链路就是不稳定——眼图闭合、误码率飙升、EMI测试不过。反复检查原理图没问题&#xff0c;电源也干净&#xff0c;最后排查到头…

作者头像 李华
网站建设 2026/4/9 17:43:22

Java程序员的AI大模型转型之旅:从基础到实战的系统化学习路径

文章为Java程序员提供了转型大模型开发的系统化学习路径&#xff0c;分为六个阶段&#xff1a;基础准备&#xff08;Python和数学&#xff09;、机器学习基础、深度学习入门、大模型专门技术、应用开发及项目实践。文章强调Java开发者凭借工程化能力、系统设计思维和企业级开发…

作者头像 李华