救生艇
难度:
标签:
题目描述
代码结果
运行时间: 72 ms, 内存: 22.3 MB
/*
* 思路:
* 1. 将数组进行排序。
* 2. 使用双指针,一个指向最轻的人,一个指向最重的人。
* 3. 每次尝试将最轻和最重的人一起放到一艘船上,如果他们的重量和不超过限制,就将两个指针向内移动。
* 4. 如果不能一起放到一艘船上,只将最重的人放到船上,指向最重的指针左移。
* 5. 重复以上步骤直到所有人都被放到船上。
*/
import java.util.Arrays;
public class Solution {
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);
int[] pointers = {0, people.length - 1};
int boats = 0;
while (pointers[0] <= pointers[1]) {
int i = pointers[0], j = pointers[1];
if (people[i] + people[j] <= limit) {
pointers[0]++;
}
pointers[1]--;
boats++;
}
return boats;
}
}
解释
方法:
此题解采用了计数排序和双指针技术来解决问题。首先,创建一个计数数组来存储每个可能的体重值的人数。然后初始化答案为人数总和,假设每个人都单独乘坐一艘船。使用双指针技术,一个指针从最轻的体重开始,另一个从最重的体重开始,尝试将两个体重的人配对乘坐同一艘船。如果可以配对,则减少相应的人数和所需的船数。当两个指针相遇时,停止配对,并检查最后剩余的同体重人是否可以成对乘坐。
时间复杂度:
O(n + limit)
空间复杂度:
O(limit)
代码细节讲解
🦆
在题解中,为什么选择使用计数排序而不是其他排序方式来处理`people`数组?
▷🦆
题解提到双指针从最轻和最重体重开始配对,如何确保两人的总体重不超过限制`limit`?
▷🦆
当两个指针的体重之和恰好等于`limit`时,题解中是如何处理的?是否直接配对并移动指针,还是有其他的考虑?
▷🦆
为什么在双指针相遇时停止配对是正确的逻辑?这是否意味着没有更多有效的配对可能?
▷