问题描述:
来源:LeetCode第881题
难度:中等
给定数组 people 。people[i]表示第 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 <= 5 * 104
1 <= people[i] <= limit <= 3 * 104
贪心算法解决:
我们先分析:什么情况下所需的船最少呢?那肯定是坐两个人的船越多则船数最少。所以我们需要对people数组进行排序,先考虑体重最大的人。
1,如果最大体重和最小体重相加小于或等于limit,就让二者坐一艘船。
2,如果最大体重和最小体重相加大于limit,就说明前者和任何其他人都不能坐一艘船即他单独一艘船。
理解原理后,看代码如下:
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit)
{
int len=people.size();
//对people数组从小到大排序
sort(people.begin(),people.end());
//right 和 left 分别指向最大体重 和最小体重
int right=len-1,left=0,count=0;
while(left<=right)
{
if(people[right]+people[left]<=limit)
{
left++;
}
//count用于记船数
count++;
//不管哪种情况,最大体重都会坐船,所以right 一定会减一
right--;
}
return count;
}
};