881.救生艇

目录

题目

给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。

每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。

返回 承载所有人所需的最小船数 。

过程

cpp 复制代码
class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
        sort(people.begin(),people.end());
        int sum=0;//船的计数
        int l=0;
        int r=people.size()-1;
        //最小的和最大的坐船,如果超重了,那么就是最大的独自一条船,
        while(l<r){
            if(people[l]+people[r]<limit){
                sum++;
                r--;
                l++;
            }else if(people[l]+people[r]>limit){
                sum++;
                r--;
            }else{
                sum++;
                l++;
                r--;
            }
        }
        return sum;
    }
};

发现最后总是会少一条船,可能忘记最后一条了。

推演了一下,确实l和r重合的时候,还有一个人,一条船没有计数

再最后加一个出while的判断。

cpp 复制代码
class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
        sort(people.begin(),people.end());
        int sum=0;//船的计数
        int l=0;
        int r=people.size()-1;
        //最小的和最大的坐船,如果超重了,那么就是最大的独自一条船,
        while(l<r){
            if(people[l]+people[r]<limit){
                sum++;
                r--;
                l++;
            }else if(people[l]+people[r]>limit){
                sum++;
                r--;
            }else{
                sum++;
                l++;
                r--;
            }
            if(l==r){
                sum++;
                l++;
            }
        }
        return sum;
    }
};

感觉双指针主要难点就是想清楚什么时候哪一边收敛。

相关推荐
3壹4 分钟前
数据结构精讲:栈与队列实战指南
c语言·开发语言·数据结构·c++·算法
skytier40 分钟前
Construct内报错和定位解决
算法
skytier44 分钟前
Ascend print数据落盘使用
算法
etcix1 小时前
dmenux.c: integrate dmenu project as one file
c语言·前端·算法
papership1 小时前
【入门级-算法-6、排序算法:选择排序】
数据结构·算法·排序算法
汉克老师2 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(4、最大空白区)
c++·算法·蓝桥杯·蓝桥杯c++·c++蓝桥杯
共享家95272 小时前
优先搜索(DFS)实战
算法·leetcode·深度优先
一只懒洋洋2 小时前
中值滤波、方框滤波、高斯滤波、均值滤波、膨胀、腐蚀、开运算、闭运算
算法·均值算法
shellvon2 小时前
你怎么被识别的?从TLS到Canvas的设备追踪术
后端·算法
薛定谔的算法2 小时前
JavaScript栈的实现与应用:从基础到实战
前端·javascript·算法