Leetcode 1094. 拼车

2025/04/12

1094. 拼车

车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)

给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi 。这些位置是从汽车的初始位置向东的公里数。

当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false。

示例 1:

输入:trips = [[2,1,5],[3,3,7]], capacity = 4 输出:false

// 贪心  
// 借助优先队列,按照乘客上车的时间从小到大排序之后,每次上车之前,把之前时间下车的乘客去掉,
// 在这个过程中统计车上的总人数,如果某次上车之后,总人数超过capacity,则返回false;否则,最终返回true
/**
 * @param {number[][]} trips
 * @param {number} capacity
 * @return {boolean}
 */
var carPooling = function (trips, capacity) {
    trips.sort((a, b) => a[1] - b[1])
    let q = new PriorityQueue({ compare: (a, b) => a[2] - b[2] }), cap = 0
    for (let [a, b, c] of trips) {
        while (q.size() && q.front()[2] <= b) {
            let top = q.front()
            cap -= top[0]
            q.dequeue()
        }
        cap += a
        if (cap > capacity) return false
        q.enqueue([a, b, c])
    }

    return true

};

// 差分
// 借助哈希表
// 由于总路程最多1000,所以创建一个大小为1001的数组记录在每个位置时车上的人数
// 遍历数组a,添加某个位置的上车人数,减掉某个位置的下车人数,就得到了每个位置增加的人数
// 最终在a的前缀和数组中,遍历每个位置,如果没有存在某个位置人数超过capacity,则返回true;否则,返回false
/**
 * @param {number[][]} trips
 * @param {number} capacity
 * @return {boolean}
 */
var carPooling = function (trips, capacity) {
    let cnt = Array(1001).fill(0)
    for (let [a, b, c] of trips) {
        cnt[b] += a
        cnt[c] -= a
    }
    let sum = 0
    for (let i = 0; i < 1001; i++) {
        sum += cnt[i]
        if (sum > capacity) return false
    }
    return true
};

Post Directory