题目描述
第 i
个人的体重为 people[i]
,每艘船可以承载的最大重量为 limit
。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit
。
返回载到每一个人所需的最小船数。(保证每个人都能被船载)。
样例
输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)
输入:people = [3,2,2,1], limit = 3
输出:3
解释:3 艘船分别载 (1, 2), (2) 和 (3)
输入:people = [3,5,3,4], limit = 5
输出:4
解释:4 艘船分别载 (3), (3), (4), (5)
限制
1 <= people.length <= 50000
1 <= people[i] <= limit <= 30000
算法
(贪心) $O(n \log n)$
- 将人按重量排序。
- 如果当前最重的人和当前最轻的人能坐到一条船上,则他们坐一条船。否则当前最重的人单独坐一条船走。
时间复杂度
- 排序的时间复杂度为 $O(n \log n)$。
- 排序后,每个人仅需要遍历一次,故总时间复杂度为 $O(n \log n)$。
空间复杂度
- 仅需要常数的额外空间。
C++ 代码
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
sort(people.begin(), people.end());
int i = 0, j = people.size() - 1, ans = 0;
while (i <= j) {
if (i != j && people[i] + people[j] <= limit)
i++;
j--;
ans++;
}
return ans;
}
};