前缀和与差分 (Prefix Sum & Difference)
前缀和与差分(Prefix Sum & Difference)
前缀和用于快速计算区间和,差分用于高效处理区间修改,是数组区间问题的常用技巧。
原理与常见类型
- 前缀和:sum[i] = a[0] + … + a[i-1],区间和为sum[j+1]-sum[i]
- 差分数组:diff[i] = a[i] - a[i-1],区间加减可O(1)处理
典型例题
1. 区域和检索 - 数组不可变(前缀和)
class NumArray:
def __init__(self, nums):
self.sums = [0]
for num in nums:
self.sums.append(self.sums[-1] + num)
def sumRange(self, i, j):
return self.sums[j+1] - self.sums[i]
2. 航班预订统计(差分)
def corpFlightBookings(bookings, n):
diff = [0]*(n+2)
for l, r, v in bookings:
diff[l] += v
diff[r+1] -= v
res = [0]*(n+1)
for i in range(1, n+1):
res[i] = res[i-1] + diff[i]
return res[1:]
3. 连续子数组的和(前缀和+哈希)
def subarraySum(nums, k):
count = 0
pre = 0
mp = {0:1}
for x in nums:
pre += x
count += mp.get(pre-k, 0)
mp[pre] = mp.get(pre, 0) + 1
return count
应用场景
- 区间和、区间频率统计
- 区间加减、区间更新
- 子数组和、区间计数