第 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
解题思路:
贪心算法,hash 。每次先考虑最重的人,假设体重是people[i],对应的数量是hash[people[i]];
这个人将单独乘坐一条船。如果不可能寻找到队友。res+=hash[people[i]]。
或者与另外一个人共同乘坐一条船。体重相同的人可能有多个,优先查找最重的可匹配对象。
重复1,2直到people[i]体重的人匹配完毕。
重复1,2,3直到所有人都搭上了船。
C++
|
static int speed_up = []() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
return 0;
}();
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
vector<int> hash(30001, 0);
int i = 1, j, size = people.size();
for (i = 1; i <= size; i++) hash[people[i - 1]]++;
int res = 0;
for (i = limit; i >= 1; i--) {
if (hash[i] == 0) continue;
int max_w = limit - i;
if (max_w == 0) {
res += hash[i];
hash[i] = 0;
continue;
}
//尝试寻找最重的能搭载的乘客
if (limit >= i * 2) {
res += hash[i] / 2;
hash[i] %= 2;
if (hash[i] == 0) continue;
}
for (j = min(max_w, i-1); j >= 1; j--) {
if (hash[j] > 0) {
int val = min(hash[j], hash[i]);
hash[i] -= val;
hash[j] -= val;
res += val;
if (hash[i] == 0) break;
}
}
res += hash[i];
hash[i] = 0;
}
return res;
}
};
|
