LeetCode 881. 救生艇

Posted 数据结构和算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 881. 救生艇相关的知识,希望对你有一定的参考价值。

截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666


题中说了每艘船最多可同时载两人,要让船最少,就应该让载两人的船最多。解题思路就是先对数组进行排序,我们优先考虑体重最大的。

  • 如果体重最大的和体重最小的可以同时乘坐一艘船,就让他俩乘坐一条船。
  • 如果体重最大的和体重最小的不能同时乘坐一艘船,那么体重最大的和其他任何人都不可能同时乘坐一条船,我们只能给体重最大的单独分配一条船。

原理比较简单,我们来看下代码。

public int numRescueBoats(int[] people, int limit) {
    //先对数组进行排序(人发重量按照从小到大的顺序排序)
    Arrays.sort(people);
    //统计船的个数
    int count = 0;
    //从小到大排序,左边的是最小的,右边的是最大的
    int left = 0;
    int right = people.length - 1;
    while (left <= right) {
        //如果体重最大的和体重最小的可以单独乘坐
        //一条船,就让他们同乘一条船
        if (people[right] + people[left] <= limit)
            left++;
        //体重最大的每次都要减1
        right--;
        //使用船的数量
        count++;
    }
    return count;
}

时间复杂度:O(nlog(n)),这个是排序使用的复杂度。

空间复杂度:O(log(n)),排序使用的空间复杂度,这个需要看Arrays.sort的源码,他调用的是DualPivotQuicksort类中的方法。

以上是关于LeetCode 881. 救生艇的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 881. 救生艇

LeetCode 881 救生艇[贪心 双指针] HERODING的LeetCode之路

Leetcode刷题100天—881. 救生艇(排序)—day19

Leetcode刷题100天—881. 救生艇(排序)—day19

LeetCode 797. 所有可能的路径(dfs) / 881. 救生艇(双指针,贪心) / 295. 数据流的中位数(对顶堆)

Code皮皮虾贪心And双指针快速解题:881. 救生艇