每日一题 | 如何快速过河 | 桶排序与双指针
点击上方蓝色字体,关注我们,支持我们
历史最初的记载大禹治水,到如今庚子年的各地暴雨,各地水库告急并且超过预警线,自然灾害问题一直在困扰着人们的生活。假设在某地已经连日暴雨,村民如今急需去山顶高地处避难,路过一条河,河流上张三有一条船可以供给村民过,现已知船一次可以载2位乘客,并且一次不可以载客的重量不可以超过N,问:如何利用最少的次数将村民载过河?
提示: 编写程序入参:
public int numRescueBoats(int[] people, int limit) {
}
提示:编写程序入参:数组 people 为每个村民体重的数组,
limit为船的最大载重量.
答案分割线 ==================================
解题思路:按题要求,一次2个乘客,且载客量最大limit,则优先考虑最轻的和最重的进行组合,如果满足则继续下一组匹配,如果不匹配,则优先考虑最重的剔除并取下一个重位乘客。
则有代码:
class Solution {
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);
int i = 0, j = people.length - 1;
int ans = 0;
while (i <= j) {
ans++;
if (people[i] + people[j] <= limit)
i++;
j--;
}
return ans;
}
}
复杂度分析
时间复杂度:O(N \log N)O(NlogN),其中 NN 是 people 的长度。
空间复杂度:O(N)O(N)。
思考:桶排序和Arrays.sort() 对比 场景优势,此题考虑桶排序+双指针又如何得出最优解呢?