vlambda博客
学习文章列表

每日一题 | 如何快速过河 | 桶排序与双指针


    

点击上方蓝色字体,关注我们,支持我们

       历史最初的记载大禹治水,到如今庚子年的各地暴雨,各地水库告急并且超过预警线,自然灾害问题一直在困扰着人们的生活。假设在某地已经连日暴雨,村民如今急需去山顶高地处避难,路过一条河,河流上张三有一条船可以供给村民过,现已知船一次可以载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() 对比 场景优势,此题考虑桶排序+双指针又如何得出最优解呢?