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

解题思路:

贪心:将序列排序,从小到大,然后定义两个指针,一个指向下标0,最小元素,一个指向最后一个元素,最大的元素,然后打右边指针大于等于左边指针时,进入循环,定义一个变量,记录船只量。

当两个指针所指元素大于limit,说明右指针指的元素需要占用一个船,然后右指针左移,否则两个元素可以共用一张船,此时左右指针互相靠近。sum在后面负责++,记录船只数量。

代码实现:

class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {// 0   1   2   3----下标
        sort(people.begin(),people.end());//从小到大进行排序1   2   2   3
        int left,right,sum=0;             //            left->       <-right
        left=0;                                     //left指向排序后的第一个元素                         
        right=people.size()-1;                     //right指向排序后的最后一个元素
        while(right>=left){                       //当right大于等于left的时候进入循环
            if(people[left]+people[right]>limit){//当两个指针指向的元素之和大于limit
                right--;//right指针向左移动,移向更小的元素
            }else
//当两个指针指向的两个元素小于等于limit,此时说明可以在一艘船上,left指针右移right指针左移,继续遍历
            {
                right--;
                left++;
            }
            sum++;     //sum用于累加所用的船数。不管是执行if后,还是else后,sum都要sum++,
        }
        
        return sum;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值