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 救生艇[贪心 双指针] HERODING的LeetCode之路
Leetcode刷题100天—881. 救生艇(排序)—day19
Leetcode刷题100天—881. 救生艇(排序)—day19
LeetCode 797. 所有可能的路径(dfs) / 881. 救生艇(双指针,贪心) / 295. 数据流的中位数(对顶堆)