拼车
难度:
标签:
题目描述
代码结果
运行时间: 17 ms, 内存: 16.4 MB
/*
* 思路:
* 1. 依然使用 toTrack 数组记录每个位置的乘客变化量。
* 2. 通过 Stream 处理 trips 数组,记录乘客上车和下车的变化。
* 3. 最后使用 Stream 计算乘客总数并验证是否超过容量。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class CarPooling {
public boolean carPooling(int[][] trips, int capacity) {
int[] toTrack = new int[1001];
Arrays.stream(trips).forEach(trip -> {
toTrack[trip[1]] += trip[0];
toTrack[trip[2]] -= trip[0];
});
return IntStream.of(toTrack).reduce(0, (currentPassengers, change) -> {
currentPassengers += change;
if (currentPassengers > capacity) throw new RuntimeException();
return currentPassengers;
}) <= capacity;
}
}
解释
方法:
此题解采用的是差分数组的方法。首先,创建一个差分数组 dp,其长度为所有行程结束位置的最大值加一。对于每个行程 [numPassengers, from, to],在差分数组的 from 位置增加 numPassengers,表示这点有乘客上车;在 to 位置减去 numPassengers,表示这点有乘客下车。之后,计算差分数组的前缀和,得到每个位置的车上乘客数。如果任何位置的乘客数超过了车辆的容量,返回 false;否则,如果所有位置的乘客数都不超过容量,返回 true。
时间复杂度:
O(n + m)
空间复杂度:
O(m)
代码细节讲解
🦆
在差分数组方法中,为什么选择在`from`位置增加乘客数,在`to`位置减少乘客数?这种处理方式有何意义?
▷🦆
如果行程中有多个地点同时是上车点和下车点,代码中的差分数组处理是否会准确反映每个点的乘客变化?
▷🦆
对于差分数组,计算前缀和时如何保证不会出现前缀和小于零的情况?这是否意味着车上始终有乘客?
▷🦆
给出的代码示例中,为什么使用`max([el for el in accumulate(dp)])`来判断所有位置的乘客数是否超过容量,而不是逐一检查?
▷