版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40697071/article/details/86685367
题目: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;
}