目录
题目
给定数组 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;
}
};
感觉双指针主要难点就是想清楚什么时候哪一边收敛。