1 题目
The i
-th person has weight people[i]
, and each boat can carry a maximum weight of limit
.
Each boat carries at most 2 people at the same time, provided the sum of the weight of those people is at most limit
.
Return the minimum number of boats to carry every given person. (It is guaranteed each person can be carried by a boat.)
Example 1:
Input: people = [1,2], limit = 3
Output: 1
Explanation: 1 boat (1, 2)
Example 2:
Input: people = [3,2,2,1], limit = 3
Output: 3
Explanation: 3 boats (1, 2), (2) and (3)
Example 3:
Input: people = [3,5,3,4], limit = 5
Output: 4
Explanation: 4 boats (3), (3), (4), (5)
Note:
1 <= people.length <= 50000
1 <= people[i] <= limit <= 30000
2 尝试解
2.1 分析
有N个人待救援,每个人体重为N[i],一艘船承重为limit,且所有人的重量都不超过船的承重limit>= N[i]。 问至少要多少艘船才能救出这些人。
将这些人按体重排序,最开始假设所有人都各用一艘船,然后逐步减少船只。考虑最轻的人,如果有船只可以放两个人,那么用最轻的人换掉其中任意一个都可以。把最轻的人放上去,然后从最重的人开始遍历,直到找到能够和他共乘的人,船只数量减一。重新考虑次轻的人和次重的人。
2.2 代码
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
sort(people.begin(),people.end());
int result = people.size();
int left = 0, right =people.size()-1;
while(left <right){
while(left < right && people[left]+people[right] > limit) right--;
if(left < right){
left++;
right--;
result--;
}
}
return result;
}
};
3 标准解
class Solution {
public:
int numRescueBoats(vector<int> people, int limit) {
int i, j;
sort(people.rbegin(), people.rend());
for (i = 0, j = people.size() - 1; i <= j; ++i)
if (people[i] + people[j] <= limit) j--;
return i;
}
};