第 i
个人的体重为 people[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 <= 50000
1 <= people[i] <= limit <= 30000
思路:这道题的第一思路是对数组进行有小到大排序,然后尽可能把小的元素组合,最后剩下大的数,但是在这个样例上就无法通过,[1,2,4,5] 6,最佳的答案是1,5一组,2,4一组,但是按照之前的思路出来是3个组,所以这个思路不对。
第二思路是把最重的元素和最轻的元素组合,如果小于等于limit,那么就把最重的元素和最轻的元素组合,否则单独让最重的元素单独一个组。
参考代码:
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
if (people.size() == 0) return 0;
int res = 0, left = 0,right=people.size()-1;
sort(people.begin(), people.end());
int person_left = 0;
while (left <= right) {
if (people[right] == limit) right--, res++;
else {
person_left = 1;
int cur = people[right] + people[left];
while (left <= right && cur <= limit && person_left < 2) {
cur += people[++left];
person_left++;
}
res++;
right--;
}
}
return res;
}
};
思路二:因为这道题有一些限制,所以代码可以优化,由于每艘船最多只能做2个人,所以只会出现要不重的人单独坐一艘船,要不最重的和最轻的人组合坐一艘,无论哪种情况船的数量都会+1,所以内层while循环和设置船人数的变量person_left可以用if代替。
参考代码如下:
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
int left = 0, right = people.size() - 1,res=0;
sort(people.begin(), people.end());
while (left <= right) {
res++;
if (left <= right && (people[left] + people[right]) <= limit) {
left++;
}
right--;
}
return res;
}
};