差分数组 航班统计票

67 阅读1分钟

题目

image.png

  • 通过差分数组,只需要遍历一次即能求得每个位置的累加情况
  • 差分其实就是前缀和的逆运算
  • 假设一开始为 [0,0,0,0],对于[0,3,3]0到3范围上每个位置+3,[3,3,3,3,0]转换成差分数组[3,0,0,0,-3],每个位置累加之前的位置即能还原
  • 对于[1,2,2],对于1到2范围每个位置+2,转换成差分数组[3,2,0,-2,0,-3],按照累加和还原[3,5,5,3,3,0]
function process(arr) {
  // 航班从 1 开始
  const preSum = Array(arr.length + 2).fill(0);
  for (let i = 0; i < arr.length; i++) {
    const temp = arr[i];
    preSum[temp[0]] = temp[2];
    preSum[temp[1] + 1] = -temp[2];
  }
  const res = [];
  for (let i = 1; i <= preSum.length - 2; i++) {
    res[i] = res[i] + res[i - 1];
  }

  return res.slice(1, arr.length + 1);
}