881、救生艇

  1. 题目
    1. 示例 1:
    2. 示例 2:
    3. 示例 3:
  2. 分析
    1. 排序 + 头尾双指针

题目

给定数组 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)

示例 3:

输入:people = [3,5,3,4], limit = 5
输出:4
解释:4 艘船分别载 (3), (3), (4), (5)

提示:

  • $1 <= people.length <= 5 * 10^4$
  • $1 <= people[i] <= limit <= 3 * 10^4$

分析

最少的小船数量,每个船:

  • 最多载两个人
  • 总重量小雨limit

由于 people[i] < limit,我们可以先排序,先尝试一头一尾两两组合乘船,之后:‘

  • 如果先处理只能一个人乘船的case
  • 再处理两个人一起乘船的case

排序 + 头尾双指针

class Solution {
    public int numRescueBoats(int[] people, int limit) {
        Arrays.sort(people);

        int l = 0;int r = people.length - 1;
        int count = 0;
        while(l <= r) {
            if (people[l] + people[r] <= limit) {
                ++l;
            } 
            --r;// 不管有没有,最大值肯定可以移除
            ++count;
        }
        return count;
    }
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

💰

Title:881、救生艇

Count:346

Author:攀登

Created At:2024-06-10, 10:02:48

Updated At:2024-06-15, 15:52:32

Url:http://jiafeimao-gjf.github.io/2024/06/10/881%E3%80%81%E6%95%91%E7%94%9F%E8%89%87/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation