救生艇

2024-06-10

题目:

给定数组 peoplepeople[i]表示第 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)

提示:

  • 1 <= people.length <= 5 * 104
  • 1 <= people[i] <= limit <= 3 * 104

思路:

要想要船的数量最少,那么我们应该让每艘船尽可能都载两个人。
那么限制是什么呢?	people[i]的重量有点大,导致船的剩余承重没法载两个人
所以思路就要转换成让每一艘船的承重都尽量逼近limit。

那么一艘船上的一个人一定是重量大的,另一个重量小的
那么排序 + 贪心就是思路

先将people数组排序,然后利用双指针指向首i尾j,如果limit - people[j] >= people[i]那么这两个人就可以一艘船。否则就people[j]单独一艘船(没有其他办法了,people[i]已经是最小的了)

代码:

class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
        sort(people.begin(), people.end());
        int n = people.size();
        int i = 0, j = n - 1;
        int ans = 0;
        while (i < j) {
            int remain = limit - people[j];
            if (remain >= people[i]) {
                i++;
            }
            j--;ans++;
        }
        if (i == j) ans++;
        return ans;
    }
};