【算法题解】救生艇问题 —— 如何用最少的船载完所有人
题目描述
给定一个数组 people
,其中 people[i]
表示第 i
个人的体重,同时有无数艘船可用,每艘船的最大承载重量为 limit
。
约束条件:
- 每艘船最多可以载两个人。
- 两个人的体重之和不能超过船的承载重量
limit
。
目标: 返回能将所有人都载走所需的 最小船数。
解题分析
这是一个典型的贪心算法问题,也被称为“救生艇问题”,在 LeetCode 上编号为 881。
想要用最少数量的船载完所有人,关键在于尽量让两个体重加起来不超过限制的人搭乘同一艘船,从而节省船只数量。
具体分析:
- 体重最重的人最好和体重最轻的人搭配上船,这样能最大化利用船的剩余承载能力。
- 若最重和最轻两个人的体重和超过了
limit
,那只能让最重的人单独坐船。 - 使用双指针策略:一头指向最轻的人,一头指向最重的人,向中间靠拢。