881. 救生艇
要使需要的船数尽可能地少,应当使载两人的船尽可能地多。
设people 的长度为 n。考虑体重最轻的人:
- 若他不能与体重最重的人同乘一艘船,那么体重最重的人无法与任何人同乘一艘船,此时应单独分配一艘船给体重最重的人。
从people中去掉体重最重的人后,我们缩小了问题的规模,变成求解剩余n-1
个人所需的最小船数,将其+1
即为原问题的答案。 - 若他能与体重最重的人同乘一艘船,那么他能与其余任何人同乘一艘船,为了尽可能地利用船的承载重量,选择与体重最重的人同乘一艘船是最优的。
从 people中去掉体重最轻和体重最重的人后,我们缩小了问题的规模,变成求解剩余n−2
个人所需的最小船数,将其+1
即为原问题的答案。
在代码实现时,我们可以先对people 排序,然后用两个指针分别指向体重最轻和体重最重的人,按照上述规则来移动指针,并统计答案。
import java.util.Arrays;
public class Solution {
public int numRescueBoats(int[] people, int limit) {
//贪心
int ans = 0;
Arrays.sort(people);
int light = 0;
int heavy = people.length - 1;
while (light <= heavy) {
if (people[light] + people[heavy] <= limit) {
light++;
}
heavy--;
ans++;
}
return ans;
}
}