news 2026/2/24 20:13:56

前缀和算法:从一道 LeetCode 题看区间求和优化思想

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前缀和算法:从一道 LeetCode 题看区间求和优化思想

文章目录

    • 1. 引言:区间求和的性能困境
    • 2. 什么是前缀和?
    • 3. 示例代码解析
    • 4. 前缀和数组的构建过程
      • 4.1 为什么长度是 n+1?
      • 4.2 构造过程分析
    • 5. 区间求和公式推导
      • 5.1 数学推导
      • 5.2 图形理解
    • 6. 时间复杂度分析
    • 7. 为什么前缀和如此重要?
    • 8. 常见扩展题型
      • 8.1 区间和为 K 的子数组
      • 8.2 二维前缀和
      • 8.3 差分数组(前缀和的逆运算)
    • 9. 什么时候不适合用前缀和?
    • 10. 面试高频问题
      • Q1:为什么 sums 多开一位?
      • Q2:能不能不用额外空间?
      • Q3:前缀和和滑动窗口的区别?

1. 引言:区间求和的性能困境

给定一个数组,多次查询某个区间[i, j]的元素之和。

最直观的做法是:

for(intk=i;k<=j;k++){sum+=nums[k];}

时间复杂度:

❌ 每次查询 O(n)

当查询次数很多时,性能会急剧下降。

这类问题的本质是:

👉重复计算大量相同区间数据

而前缀和,正是解决这一问题的利器。


2. 什么是前缀和?

前缀和(Prefix Sum)指的是:

一个数组中,从第 0 个元素到当前位置的累加和。

定义:

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

也就是说:

  • prefix[0] = 0
  • prefix[1] = nums[0]
  • prefix[2] = nums[0] + nums[1]

这种设计可以极大方便区间计算。


3. 示例代码解析

题目代码如下:

classNumArray{int[]sums;publicNumArray(int[]nums){intn=nums.length;sums=newint[n+1];for(inti=0;i<n;i++){sums[i+1]=sums[i]+nums[i];}}publicintsumRange(inti,intj){returnsums[j+1]-sums[i];}}

可参考灵神题解:前缀和,附扩展问题(Python/Java/C++/C/Go/JS/Rust)

这是 LeetCode 303:区域和检索 的经典解法。


4. 前缀和数组的构建过程

4.1 为什么长度是 n+1?

sums=newint[n+1];

多开一个位置,是为了统一计算公式。

令:

sums[0] = 0

这样可以避免边界特判。

否则得判断边界:

sumRange(i,j)=sums[j]-sums[i-1]// 当 i > 0 时sumRange(0,j)=sums[j]// 当 i = 0 时

4.2 构造过程分析

核心代码:

sums[i+1]=sums[i]+nums[i];

假设:

nums = [2, 4, 6, 8]

构造过程:

inums[i]sums[i]sums[i+1]
0202
1426
26612
381220

最终:

sums = [0, 2, 6, 12, 20]

5. 区间求和公式推导

查询代码:

returnsums[j+1]-sums[i];

为什么这样就能得到[i, j]的和?


5.1 数学推导

根据定义:

sums[j+1] = nums[0] + ... + nums[j] sums[i] = nums[0] + ... + nums[i-1]

相减:

sums[j+1] - sums[i] = nums[i] + ... + nums[j]

刚好是目标区间。


5.2 图形理解

0 ---- i ---- j ---- n |------|====|--------| 去掉 保留

前面减掉,只留下中间。


6. 时间复杂度分析

操作复杂度
构建O(n)
查询O(1)
空间O(n)

对比暴力法:

方法单次查询
暴力O(n)
前缀和O(1)

👉以空间换时间的经典案例


7. 为什么前缀和如此重要?

前缀和是很多高级算法的基础,包括:

  • 滑动窗口
  • 差分数组
  • 二维矩阵处理
  • 哈希优化
  • 动态规划

几乎是刷题必备技能。


8. 常见扩展题型

8.1 区间和为 K 的子数组

560. 和为 K 的子数组

思想:

前缀和 + HashMap

sum[i] - sum[j] = k

8.2 二维前缀和

用于矩阵求和:

sum[i][j] = 左 + 上 - 左上 + 当前

常见于图像处理、地图统计。


8.3 差分数组(前缀和的逆运算)

区间修改问题:

diff[l]++ diff[r+1]--

最后再前缀和还原。


9. 什么时候不适合用前缀和?

前缀和适用于:

✔ 静态数组
✔ 多次查询
✔ 无修改操作

不适合:

❌ 高频修改数组
❌ 动态插入删除

此时应该考虑:

  • 线段树
  • 树状数组

10. 面试高频问题

Q1:为什么 sums 多开一位?

统一公式,减少边界判断。


Q2:能不能不用额外空间?

理论上可以边算边存,但查询效率会下降。


Q3:前缀和和滑动窗口的区别?

技术是否支持随机查询
前缀和支持
滑动窗口不支持
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 11:37:52

Elastic 9.3:与数据对话、构建自定义 AI agents、实现全自动化

作者&#xff1a;来自 Elastic Dan Courcy 今天&#xff0c;我们很高兴宣布 Elastic 9.3 正式发布&#xff0c;作为 Elasticsearch 平台的最新版本 —— 这是全球最受欢迎的开源平台&#xff0c;用于将结构化和非结构化数据转化为可信的答案和成果。 全球最受欢迎的开源平台&am…

作者头像 李华
网站建设 2026/2/22 10:01:59

算法日记:穷举vs暴搜vs深搜vs回溯vs剪枝--全排列

&#x1f3ac; 胖咕噜的稞达鸭&#xff1a;个人主页 &#x1f525; 个人专栏: 《数据结构》《C初阶高阶》 《Linux系统学习》 《算法日记》 ⛺️技术的杠杆&#xff0c;撬动整个世界! 全排列&#xff1a; 全排列 算法原理&#xff1a; 穷举–枚举 两数之和->两层 for 循…

作者头像 李华
网站建设 2026/2/24 11:12:17

直接法 读书笔记 00 目录

前言目录1 引言 1.1 线性代数 1.2 图论、算法与数据结构 1.3 延伸阅读2 基础算法 2.1 稀疏矩阵数据结构 2.2 矩阵‑向量乘法 2.3 工具函数 2.4 三元组形式 2.5 转置 2.6 合并重复项 2.7 删除矩阵中的项 2.8 矩阵乘法 2.9 矩阵加法 2.10 向量置换 2.11 矩阵置换 2.12 矩阵范数 2…

作者头像 李华
网站建设 2026/2/24 6:00:52

开发手机app防盗功能

我已经说完了------主要是针对静止手机被别人拿走的那种类型。比如放在桌子上的手机&#xff0c;不经意被人拿走。这个时候会报警。

作者头像 李华
网站建设 2026/2/23 2:45:21

乐天Rakuten开店:乐天Rakuten跨境店VS本土店?2026实战攻略

乐天Rakuten作为日本最大的电商平台之一&#xff0c;为全球卖家提供了广阔的商机。然而&#xff0c;如何选择合适的入驻方式、如何运营并获取高流量&#xff0c;仍然是许多卖家面临的难题。在这篇文章中&#xff0c;我们将全面解析如何根据自身情况选择本土店和跨境店的入驻方式…

作者头像 李华