螺旋数组

leetcode:

前缀和

对于一个数组,从第一个开始,每迭代到一个数,都把前面的和加到自身

作用:可以快速计算子数组之和(如果事先计算出数组的前缀和数组,则对于任意一个子数组,都可以在 O(1) 的时间内得到其元素和)

前缀和 在涉及计算区间和的问题时非常有用

let prefix = new Array(nums.length + 1).fill(0)
for (let i = 0; i < nums.length; i++) {
  prefix[i + 1] = prefix[i] + nums[i]
}

差分数组

对数组中相邻的元素两两计算差,得到差分数组:如 [1,2,3,4,5] 的差分数组是:[1,1,1,1,1]

构造方式:

  1. 创建一个和原数组 arr 相同长度的新数组 diff,全部是 0
  2. 差分数组第一个元素和原数组第一个元素相同
  3. 对于 i = 1n-1,差分数组 diff 的第 i 个元素为 diff[i] = arr[i] - arr[i-1]
function createDiff(arr) {
    let diff = new Array(arr.length).fill(0); // 差分数组
    diff[0] = arr[0]
    for (let i = 1; i < arr.length; i++) {
      diff[i] = arr[i] - arr[i - 1]
    }
    return diff;
}

作用:

可以将 对原始数组连续子数组的区间批量操作 转化为 对差分数组中两个数的操作

如:对 [1,2,3,4,5] 中前四个数都加 2 变为 [3,4,5,6,5],差分数组变为 [3,1,1,1,-1] 相当于只需要对其差分数组的第一个值 +2,最后一个值 -2

差分数组还原成原数组:

只需要对差分数组求前缀和即可

分享|【算法小课堂】差分数组(Python/Java/C++/Go/JS) - 讨论 - 力扣(LeetCode)

leetcode: