LeetCode 881. 救生艇

本文探讨了救生艇问题,一种经典的贪心算法应用案例。通过实例解析,详细介绍了如何利用双指针法和排序策略,实现人员在限制条件下的最优分配,以求得最少所需船只数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:881. 救生艇

类型:贪心算法

第 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

解题思路:

解题的思路比较简单,即先将数组按升序排序,然后用双指针法,一个指针为起始元素,另一个为结尾元素,因为每条船最多装两个人,所以我们判断前指针所指元素加上后指针所指的元素的和是否超过最大限制,如果不超过则两个人都可以被装载,如果超过最大限制,则只能装载后指针所指的值(数组的最大值默认是小于等于限制值的)。整个思路简单来说就是贪心算法,每次装尽可能多的人,以装值最大的数为主(后指针所指的值),如果可以带上前指针的值(两个之和小于限制值)则该船带上前指针的值,否则只搭载后指针的值。

代码:

    int numRescueBoats(vector<int>& people, int limit) {
        
        int res = 0, len = people.size();
        int start = 0, end = len-1;
        sort(people.begin(), people.end());
        while(start < end){
            if(people[start]+people[end] <= limit) start++;
            end--; res++;
        }
        if(start == end) res++;

        return res;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值