有勇气的牛排博客
☰

前缀和 概念与区间和

有勇气的牛排 753 算法 2025-08-10 22:19:17

知止自律打卡-微信小程序APP
一款微信自律打卡小程序,支持自定义打卡项目、习惯记录、项目日记、专注计时与数据统计。自律打卡、学习打卡、读书打卡、健身打卡、运动打卡、减肥打卡、戒色打卡、养生打卡、戒烟、戒酒、戒熬夜等多种场景。万能打卡模板自由创建。可自定义每日打卡目标,记录习惯连续天数,可视化追踪成长进度。
了解产品详情 →
微信搜索「知止自律打卡」
知止自律打卡微信小程序

前缀和 思路

1 前缀和的定义

定一前缀和数组 prefix:

prefix[i]=nums[0]+nums[1]+...+nums[i-1]

也就是说:

prefix[0] = 0 (空数组的和) prefix[1] = nums[0] prefix[2] = nums[0] + nums[1] ... prefix[i] = nums[0] + nums[1] + ... + nums[i-1]

2 区间和的目标

要求:

sumRange(left, right)=nums[left]+nums[left+1]+...+nums[right]

3 用前缀和表示

观察 prefix[right+1]和prefix[left]

prefix[right+1] = nums[0]+nums[1]+...+nums[right] prefix[left] = nums[0]+nums[1]+...+nums[left-1]

两者相减

prefix[right+1]-prefix[left] = (nums[0]+nums[1]+...+nums[right])-(nums[0]+nums[1]+...+nums[left-1]) = nums[left]+nums[left+1]+...+nums[right] # left-1之前的全部抵消

即:prefix[right+1]-prefix[left]

sumRange(left,right)=nums[left]+nums[left+1]+⋯+nums[right]
					= prefix[right+1]-prefix[left]

sumRange(left,right)=nums[left]+nums[left+1]+⋯+nums[right]=prefix[right+1]−prefix[left]\begin{aligned} sumRange(left,right)&=nums[left]+nums[left+1]+⋯+nums[right] \\ &= prefix[right+1]-prefix[left] \end{aligned}

4 举个例子

数组:nums = [-2, 0, 3, -5, 2, -1]
前缀和:prefix_sum = [0, -2, -2, 1, -4, -2, -3]

题目案例

题目: sumRange(2, 5) = 3-5+2-1 = prefix_sum[6] - prefix_sum[2] = (-3)-(-2) = -1

时间复杂度:

  • 初始化:O(n)
  • 每次查询:O(1)

空间复杂度:O(n)

总结

公式成立的原理就是 前缀和的抵消:
前缀和保存的是 从头到某个位置的和,两个前缀和相减,刚好抵消掉前面不需要的部分,留下的就是区间和。

评论区

×
×