前缀和:适用于数组不经常变化,但是经常需要查询某一个区间的区间和的情况,前缀和数组每次查询区间和时间复杂度为O(1)。普通数组每次查询区间和时间复杂度为O(n)。
- 作用:查询区间和
- 一维前缀和:sum[i]表示从0到i元素的累加和,sum[i]=sum[i-1]+arr[i]
- 二维前缀和:sum[i][j]表示从(0,0)到(i,j)的矩阵的和,sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+arr[i][j]
一维前缀和:
1 | /** |
代码简化:从1开始放
1 | /** |
二维前缀和:
差分:适用于对数组进行多次区间修改后,最终确定原数组值的情况,差分数组每次区间修改时间复杂度为O(1)。普通数组每次修改区间和时间复杂度为O(n)。
- 作用:区间修改
差分与前缀和互为逆运算:
一维差分性质:对原数组进行从[left,right]区间内每个数增加val的值,只需对差分数组进行diff[left]+val和diff[right+1]-val,再通过对差分数组进行一维前缀和便可得修改后的原数组
二维差分性质:对原数组进行从[a,b]到[c,d]矩阵内每个数增加v的值,只需对差分数组进行diff[a][b]+v、diff[a][d+1]-v、diff[c+1][b]-v、diff[c+1][d+1]+v,再通过对差分数组进行二维前缀和便可得修改后的原数组
一维差分应用:lettcode 1109 https://leetcode.cn/problems/corporate-flight-bookings/
1 | 这里有 n 个航班,它们分别从 1 到 n 进行编号。 |
1 | public int[] corpFlightBookings(int[][] bookings, int n) { |
- 本文作者: zzr
- 本文链接: http://zzruei.github.io/2023/11d8b27ba1.html
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!