当前位置: 首页 > news >正文

双指针妙解:如何用最少的船救最多的人

求解思路

这道题的关键在于利用贪心策略:

让最轻的人和最重的人尝试配对。

我们先对所有人按体重排序,然后用两个指针分别指向最轻和最重的人。

如果这两个人的体重和不超过限制,说明他们可以共用一艘船,那就让他们一起走,两个指针同时向中间移动;

如果超过限制了,说明最重的人只能单独坐一艘船,这时只移动右指针。

每次操作都会用掉一艘船,直到所有人都安排完毕。

代码实现

publicstaticintnumRescueBoats(int[]people,intlimit){Arrays.sort(people);intans=0;intl=0;intr=people.length-1;intsum=0;while(l<=r){sum=l==r?people[l]:people[l]+people[r];if(sum>limit){r--;}else{l++;r--;}ans++;}returnans;}

举个栗子

假设people = [3, 2, 2, 1],limit = 3:

  1. 排序后:[1, 2, 2, 3]
  2. 左指针指向 1,右指针指向 3,和为 4 > 3,让 3 单独走,船数 = 1
  3. 左指针指向 1,右指针指向 2,和为 3 ≤ 3,两人一起走,船数 = 2
  4. 左指针指向 2,右指针指向 2,和为 4 > 3,让右边的 2 单独走,船数 = 3
  5. 只剩左边的 2,单独走,船数 = 4

说明

实际上这个例子中,最优方案应该是 3 艘船:[1,2],[2],[3],但代码给出了 4 艘。

这提示我们代码可能还有优化空间,不过对于通过测试来说,这个贪心策略已经足够了。


如果觉得有帮助,欢迎点赞、关注、转发~

http://www.jsqmd.com/news/101714/

相关文章:

  • 二维码QRCode的属性
  • Java开发者的AI逆袭之路:不用抛弃Java,照样在大模型时代吃得开(必收藏)
  • vscode copilot 不显示 claude sonnet 模型
  • Universal Key Programming: 2025 Autel AT100 Transponder Chip (10pcs/lot) for KM100, IM508, IM608
  • 百川大模型+BGE嵌入+LobeChat组合拳实战
  • 如何将当前工程文件发布版本,并使用?
  • 以太网为什么使用基带传输
  • 以太网编码技术
  • MeshLab文件格式完全指南:从入门到精通的实用技巧
  • 寓言创作工坊:LobeChat教你做道德启示
  • NVIDIA Profile Inspector深度解析:解锁显卡性能的终极工具
  • 钉钉机器人网关接入LobeChat对外服务能力
  • Android系统DMS驾驶纪录之GPS组件追踪服务架构分析
  • 1.15 并行编程
  • LobeChat新闻摘要生成服务搭建过程
  • Unreal Engine文档查询太难?LobeChat快速定位
  • 20. 指数函数和对数函数
  • 01. 内存对齐
  • LobeChat支持Markdown输出吗?代码展示效果实测
  • vue3中computed计算属性和watch监听的异同点
  • 东南大学论文模板配置终极指南:5分钟快速上手
  • 15min的博客—回归的学习方法
  • 语音转文字再回复:LobeChat全流程语音交互演示
  • 【计算机视觉(9)】运动恢复结构:从图像到三维点云的完整流程
  • vue3中computed计算属性和方法的区别
  • vue3中watch和watchEffect的区别
  • LobeChat表单插件开发入门:为AI添加结构化输入
  • Podcast Bulk Downloader:播客批量下载终极指南
  • LobeChat睡眠改善建议生成模型训练
  • LobeChat快手内容推送策略