这是一道差分数组的经典应用题。对区间数据进行多次操作,求操作后的结果。很适合用差分数组这种算法技巧,核心就是用数组相邻元素的差值来表示两两之间的相对关系,这种相对关系是稳定且连续的;差值变化,则区间内所有元素的值会随着变化,只要把握了这种思路,就能很快解答出此题。
/**
* @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
};
还有一道拼车题,也是差分数组的变形题。
公交车有最大载客量限制,而乘客上下车,其实就是一组区间操作。很容易联想到差分数组的思路。
/**
* @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
};