差分数组

115 阅读1分钟

1109. 航班预订统计

这是一道差分数组的经典应用题。对区间数据进行多次操作,求操作后的结果。很适合用差分数组这种算法技巧,核心就是用数组相邻元素的差值来表示两两之间的相对关系,这种相对关系是稳定且连续的;差值变化,则区间内所有元素的值会随着变化,只要把握了这种思路,就能很快解答出此题。

/**
 * @param {number[][]} bookings
 * @param {number} n
 * @return {number[]}
 */
var corpFlightBookings = function(bookings, n) {
    const nums = new Array(n).fill(0)
    for (let [start, end, val] of bookings) {
        // 区间起始位置变化,代表起始位置开始,后面的元素值都变化val
        nums[start-1] += val
        // 对区间终止位后面的值,进行反操作
        if (end < nums.length) nums[end] -= val
    }
    for (let i = 1; i < nums.length; i++) {
        nums[i] += nums[i-1]
    }
    return nums
};

还有一道拼车题,也是差分数组的变形题。

1094. 拼车

公交车有最大载客量限制,而乘客上下车,其实就是一组区间操作。很容易联想到差分数组的思路。

/**
 * @param {number[][]} trips
 * @param {number} capacity
 * @return {boolean}
 */
var carPooling = function(trips, capacity) {
    // 根据题目说明,设置数组最大长度
    const len = 1001
    // 初始化数组,补0
    const res = new Array(len).fill(0)
    // 注意[from, to) 为右开区间
    for (let [num, from, to] of trips) {
        res[from] += num
        res[to] -= num
    }
    for (let i = 1; i<len; i++) {
        // 在差分数组直接叠加,剩下另外声明结果数组的空间
        res[i] += res[i-1]
    }
    for (let i = 0; i<len; i++) {
        if (res[i] > capacity) return false
    }
    return true
};