[题解]LeetCode 881. 救生艇(C++)
题目
第 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/boats-to-save-people
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
利用贪心的思想,每次先载最重的一个人,然后再看能不能同时载最轻的那个人,如果可以就载两人,如果不行就只载最重者,然后继续看剩下的人中最重的,一直到所有人都能被载后结束。或者反方向从最轻者开始思考也是等价的。为了能够获取最重者和最轻者,需要先对数组排序。
时间复杂度\(O(n*log(n))\),空间复杂度O(1)\(O(log(n))\)(排序需要额外\(O(log(n))\)的空间复杂度)。
代码
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
sort(people.begin(), people.end());
int ans = 0;
int left = 0, right = people.size() - 1;
while(left <= right)
{
if(people[left] + people[right] <= limit)
{
++left;
--right;
}
else
{
--right;
}
++ans;
}
return ans;
}
};

浙公网安备 33010602011771号