Boats to Save People 救生艇

第 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

思路:这道题的第一思路是对数组进行有小到大排序,然后尽可能把小的元素组合,最后剩下大的数,但是在这个样例上就无法通过,[1,2,4,5] 6,最佳的答案是1,5一组,2,4一组,但是按照之前的思路出来是3个组,所以这个思路不对。

第二思路是把最重的元素和最轻的元素组合,如果小于等于limit,那么就把最重的元素和最轻的元素组合,否则单独让最重的元素单独一个组。

参考代码:

class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
	if (people.size() == 0) return 0;
	int res = 0, left = 0,right=people.size()-1;
	sort(people.begin(), people.end());
	int person_left = 0;
	while (left <= right) {
		if (people[right] == limit) right--, res++;
		else {
			person_left = 1;
			int cur = people[right] + people[left];
			while (left <= right && cur <= limit && person_left < 2) {
				cur += people[++left];
				person_left++;
			}
			res++;
			right--;
		}
	}
	return res;      
    }
};

思路二:因为这道题有一些限制,所以代码可以优化,由于每艘船最多只能做2个人,所以只会出现要不重的人单独坐一艘船,要不最重的和最轻的人组合坐一艘,无论哪种情况船的数量都会+1,所以内层while循环和设置船人数的变量person_left可以用if代替。

参考代码如下:

class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
	int left = 0, right = people.size() - 1,res=0;
	sort(people.begin(), people.end());
	while (left <= right) {
		res++;
		if (left <= right && (people[left] + people[right]) <= limit) {
			left++;
		}
		right--;
	}
	return res;    
    }
};

猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/82414890