题目
给定数组 people
,people[i]
表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit
。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit
。
返回 承载所有人所需的最小船数 。
示例 1:
输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)
示例 2:
输入:people = [3,2,2,1], limit = 3
输出:3
解释:3 艘船分别载 (1, 2), (2) 和 (3)
示例 3:
输入:people = [3,5,3,4], limit = 5
输出:4
解释:4 艘船分别载 (3), (3), (4), (5)
提示:
- $1 <= people.length <= 5 * 10^4$
- $1 <= people[i] <= limit <= 3 * 10^4$
分析
最少的小船数量,每个船:
- 最多载两个人
- 总重量小雨limit
由于 people[i] < limit
,我们可以先排序,先尝试一头一尾两两组合乘船,之后:‘
- 如果先处理只能一个人乘船的case
- 再处理两个人一起乘船的case
排序 + 头尾双指针
class Solution {
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);
int l = 0;int r = people.length - 1;
int count = 0;
while(l <= r) {
if (people[l] + people[r] <= limit) {
++l;
}
--r;// 不管有没有,最大值肯定可以移除
++count;
}
return count;
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com