[题解]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;
    }
};
posted @ 2021-08-26 16:37  浮生的刹那  阅读(92)  评论(0)    收藏  举报