news 2026/3/14 4:42:58

前缀和算法:从一道 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/25 15:15:56

幻影API聚合管理系统源码基于 PHP+Mysql 进行开发

幻影API聚合管理系统源码&#xff0c;基于 PHPMysql 进行开发的&#xff0c;拥有多接口管理功能&#xff0c;支持不同的计费方式包括包月、按次、会员专享。用户可以全自动注册使用&#xff0c;系统支持在线调试和日志记录。现有API接口只需要几行代码就可以接入本系统&#xf…

作者头像 李华
网站建设 2026/3/11 13:33:44

Skills:AI能力封装协议的深度剖析,从原理到商业应用

不知道是因为推流算法&#xff0c;还是其他什么原因&#xff0c;最近打开小红书&#xff0c;微信公众号满屏满眼都是“教你怎么用 Skills”&#xff0c;“Skills 如何创造颠覆性产品”&#xff0c;“Skills Hub 站如何成就下一个‘死了么’”之类的文章。长期低估&#xff0c;短…

作者头像 李华
网站建设 2026/3/12 15:24:31

Qwen3-Coder-Next 昇腾适配:开发者在线体验一站式通关指南

2 月 4 日&#xff0c;Qwen3-Coder-Next 正式对外开源发布。该模型面向编程智能体与本地开发场景打造&#xff0c;提供完整开源权重&#xff0c;适合开发者进行二次开发与工程集成。昇腾已适配支持该模型&#xff0c;相关模型与权重已同步上线 AtomGit AI。 &#x1f449; 立即…

作者头像 李华
网站建设 2026/3/14 2:01:36

基于深度学习的相位图生成与时间序列预测系统

基于深度学习的相位图生成与时间序列预测系统 摘要 本文介绍了一种基于深度学习的方法,通过相机采集的图像序列生成对应的相位图,并实现基于时间序列的相位图预测。系统采用编码器-解码器架构处理图像到相位的映射,并结合时序模型实现帧间预测。本文将详细阐述系统设计、模…

作者头像 李华
网站建设 2026/3/13 20:22:14

Canvas 画板的实现 2.0:支持放大、缩小

在 1.0 版本中&#xff0c;画板已经具备“好用”的基础能力&#xff0c;但一旦用户想细画或写字时&#xff0c;缩放就成了刚需。本篇记录我为画板加入“放大/缩小”的实现思路&#xff1a;既保留 1.0 的绘制体验&#xff0c;又在缩放过程中保证笔迹精度与交互一致性。 目标与约…

作者头像 李华
网站建设 2026/3/8 19:54:24

领英收不到验证码怎么办? 解决方案全解析

在注册或登录 LinkedIn 时&#xff0c;很多用户都会遇到同一个问题&#xff1a;页面提示“验证码已发送”&#xff0c;但邮箱或手机始终收不到。 甚至有时会直接提示“已超出验证请求次数”。这类问题看似是短信或邮箱故障&#xff0c;实际上更多与 LinkedIn 的风控机制有关。一…

作者头像 李华