题目
给定数组 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)
思路
每艘船最多只能搭载两人,先将给定的体重数组升序排列,按照贪心的思想,使用双指针i和j,分别指向最小体重和最大体重,如果people[i]+people[j]<=limit,此时刚好让这两人上船,船的计数加1,并且i++,j--,向数组中间移动;如果体重之和大于了limit,说明此时最大体重的人people[j]与任何体重的人都无法一同乘船(people[i]已经为最小值),只能让其独自乘船,船的计数加1,即j--,i不变。首先使用了sort排序,即快排,之后的遍历一轮即可完成,时间复杂度为O(nlogn),只用了几个常数变量,空间复杂度O(logn)。
代码
class Solution {
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);//将序列排序为升序
int l=people.length;
int i=0,j=l-1;//每次取最大体重和最小体重
int ans=0;
while(i<=j){
if(people[i]+people[j]<=limit) i++;//若当前最大最小能满足载重要求,两人一同上船
j--;//否则,体重大者上船,因为无人能与其结合,体重小者等下一次判断
ans++;//船数量加1
}
return ans;
}
}