数组的前缀(例题560,304)
前缀解决的问题是频繁地查询数组的累加和问题,减少时间复杂度。
具体做法:提前存储好presum,【0,1】【0,2】,【0,3】的
【2,4】的就等于presum[4]-presum[2-1];
数组的差分(例题1094,1109),航班的,公交车呀,区间人数增减。
差分解决的问题是频繁地对数组的区间进行增减操作,
比如说,我给你输入一个数组 nums
,然后又要求给区间 nums[2..6]
全部加 1,再给 nums[3..9]
全部减 3,再给 nums[0..4]
全部加 2,再给...
类似前文前缀和技巧构造的 preSum
数组,我们先对 nums
数组构造一个 diff
差分数组,diff[i]
就是 nums[i]
和 nums[i-1]
之差:
通过这个 diff
差分数组是可以反推出原始数组 nums
的,代码逻辑如下:
int[] res = new int[diff.length]; // 根据差分数组构造结果数组 res[0] = diff[0]; for (int i = 1; i ‹ diff.length; i++) { res[i] = res[i - 1] + diff[i]; }
这样构造差分数组 diff
,就可以快速进行区间增减的操作,如果你想对区间 nums[i..j]
的元素全部加 3,那么只需要让 diff[i] += 3
,然后再让 diff[j+1] -= 3
即可。