题目描述:
第 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;
}
};