当前位置: 首页 > news >正文

前缀和算法:从一道 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:前缀和和滑动窗口的区别?

技术是否支持随机查询
前缀和支持
滑动窗口不支持
http://www.jsqmd.com/news/342714/

相关文章:

  • Elasticsearch:使用 Elastic Workflows 构建自动化
  • PPP与PPPoE协议介绍
  • Jina Rerankers 为 Elastic 推理服务(EIS)带来了快速、多语言的重排序能力
  • 低功耗蓝牙怎样音频协商音频能力?PACS(Published Audio Capabilities Service)来助力!!
  • 五种并行处理策略对比调研
  • ceph平台-未及时移除故障osd导致根目录100%问题的故障记录
  • 2026年白酒厂家权威推荐榜:白酒贴牌定制厂家、纯粮白酒厂家推荐、纯粮食白酒厂家、贴牌白酒生产厂家、酱香白酒厂家批发选择指南 - 优质品牌商家
  • 缓存特工队:深入浏览器内部的秘密仓库
  • JAVA安全基础-CC3链
  • 基于Spring Boot的企业网盘的设计与实现(开题报告)
  • AI漫剧怎么赚钱:教你用AI漫剧创作系统制作自己的动漫短剧使用云微AI短剧创作系统
  • 【Azure 环境】获取Azure上资源的创建时间createdTime信息(ARM REST API版本)
  • MySQL 导入资料详细说明
  • 米尔顿·弗里德曼《实证经济学方法论》解读
  • 汉字才是终极“外挂”!碾压英文的千年智慧,在AI时代彻底封神
  • Airlink 协议库:实现设备无缝互联的通信基石
  • 从单模态到多模态:AI原生审核技术的融合创新
  • 大规模语言模型在科学实验设计优化中的应用
  • 法尔斯新闻社1398年波斯语新闻数据集_29万条_多领域分类_完整文本内容_自然语言处理_文本挖掘_机器学习训练数据
  • 大语言模型部署难题破解:三大优化方向全解析,程序员必藏干货
  • 革新!AI应用架构师引领AI驱动元宇宙教育的创新变革
  • Skills:AI能力封装协议的深度剖析,从原理到商业应用
  • 多智能体协同评估企业创新能力
  • AI Coding时代已来:从“码农“到“架构师“的华丽转身,必看收藏指南!
  • 大模型智能体记忆机制详解:短期记忆与长期记忆如何实现
  • 幻影API聚合管理系统源码基于 PHP+Mysql 进行开发
  • 思维链推理:提升大模型能力的核心技术
  • RAG技术全攻略:从检索增强生成到Agentic RAG实战指南
  • 未来已来:全链路 Agent 工程师将重塑程序员分工体系?深度解析与实战转型指南
  • 大数据 Cassandra 与 Elasticsearch 的整合应用