1094. 拼车
假设你是一位顺风车司机,车上最初有 capacity 个空座位可以用来载客。由于道路的限制,车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向,你可以将其想象为一个向量)。
这儿有一份乘客行程计划表 trips[][],其中 trips[i] = [num_passengers, start_location, end_location] 包含了第 i 组乘客的行程信息:
必须接送的乘客数量;
乘客的上车地点;
以及乘客的下车地点。
这些给出的地点位置是从你的 初始 出发位置向前行驶到这些地点所需的距离(它们一定在你的行驶方向上)。
请你根据给出的行程计划表和车子的座位数,来判断你的车是否可以顺利完成接送所有乘客的任务(当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/car-pooling
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
查分法
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public boolean carPooling(int[][] trips, int capacity) {
int[] cnt = new int[1001];
Arrays.sort(trips, new Comparator() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[1], o2[1]);
}
});
for (int[] trip : trips) {
cnt[trip[2]] -= trip[0];
cnt[trip[1]] += trip[0];
}
int sum = 0;
for (int i = 0; i <= 1000; ++i) {
sum += cnt[i];
if (sum > capacity) {
return false;
}
}
return true;
}
}
优先队列
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
class Solution {
public boolean carPooling(int[][] trips, int capacity) {
PriorityQueue heap = new PriorityQueue<>(Comparator.comparingInt(o -> o[2]));
Arrays.sort(trips, Comparator.comparingInt(o -> o[1]));
int sum = 0;
for (int[] trip : trips) {
sum += trip[0];
while (!heap.isEmpty() && heap.peek()[2] <= trip[1]) {
sum -= heap.poll()[0];
}
if (sum > capacity) {
return false;
}
heap.offer(trip);
}
return true;
}
}