如何在 Java 中利用数组实现简单的前缀和(Prefix Sum)技术以支持 O(1) 时间的区间查询
如何在 Ja va 中利用数组实现简单的前缀和(Prefix Sum)技术以支持 O(1) 时间的区间查询 在 Ja va 开发中,尤其是处理数据查询时,你是否遇到过这样的场景:需要频繁计算一个数组中某个连续区间的元素之和?如果每次都去遍历累加,效率显然不高。这时候,前缀和(Prefix Sum)技
如何在 Ja va 中利用数组实现简单的前缀和(Prefix Sum)技术以支持 O(1) 时间的区间查询

在 Ja va 开发中,尤其是处理数据查询时,你是否遇到过这样的场景:需要频繁计算一个数组中某个连续区间的元素之和?如果每次都去遍历累加,效率显然不高。这时候,前缀和(Prefix Sum)技术就该登场了。它的核心思路非常巧妙:通过一次性的预处理,将后续所有区间求和的复杂度降至 O(1)。
构造前缀和数组
具体怎么实现呢?关键在于构建一个辅助数组。假设我们有一个原始数组 nums,长度为 n。通常,我们会选择构建一个长度为 n + 1 的“带哨兵”前缀和数组 prefix。这个小小的“+1”设计,能让我们在后续计算时省去不少边界判断的麻烦。
- 首先,初始化
prefix[0] = 0。 - 然后,从
i = 1开始遍历到n,执行prefix[i] = prefix[i - 1] + nums[i - 1]。
这样一来,prefix[i] 存储的值,就恰好是原数组 nums 中从第 0 个元素到第 i-1 个元素的总和。整个预处理过程只需要 O(n) 的时间。
实现 O(1) 区间查询
预处理完成后,真正的魔法就发生了。当我们需要查询原数组中任意闭区间 [left, right](其中 0 ≤ left ≤ right < n)的和时,只需要一个简单的减法:
sum = prefix[right + 1] - prefix[left]
这个公式为什么成立?我们拆解一下:
prefix[right + 1]代表了nums[0]到nums[right]的所有元素之和。prefix[left]代表了nums[0]到nums[left - 1]的所有元素之和。- 两者相减,中间重叠的部分被抵消,剩下的正是我们需要的
nums[left]到nums[right]的区间和。
看,一次查询,无论区间多长,都只需要常数时间,效率的提升立竿见影。
Ja va 示例代码
理论说清楚了,来看一个完整、可直接运行的 Ja va 示例代码,它会让你理解得更透彻:
public class PrefixSum { private int[] prefix;public PrefixSum(int[] nums) { int n = nums.length; prefix = new int[n + 1]; for (int i = 1; i <= n; i++) { prefix[i] = prefix[i - 1] + nums[i - 1]; } } // 查询 [left, right] 闭区间的和,O(1) public int rangeSum(int left, int right) { return prefix[right + 1] - prefix[left]; } // 使用示例 public static void main(String[] args) { int[] nums = {2, 1, 3, 5, 4}; PrefixSum ps = new PrefixSum(nums); System.out.println(ps.rangeSum(1, 3)); // nums[1]+nums[2]+nums[3] = 1+3+5 = 9 System.out.println(ps.rangeSum(0, 4)); // 全数组和 = 15 }}
注意事项与扩展
当然,前缀和技术并非万能钥匙。它最适合处理“静态数组”,也就是那些初始化后就不太会频繁修改元素值的场景。如果业务需求中需要支持大量的单点更新操作,那么前缀和每次更新都需要重新计算一大片,效率就不够看了。这时候,就该考虑更高级的数据结构,比如线段树或者树状数组(Fenwick Tree)。
最后,再划几个重点:
- 复杂度:空间复杂度为 O(n),预处理时间复杂度为 O(n),查询则是 O(1)。
- 边界检查:在实际生产代码中,务必记得在查询方法中加入索引越界的校验,例如判断
left和right是否在合法范围内,以及left是否小于等于right。- 思路延伸:这个一维前缀和的思路完全可以推广到二维,也就是“二维前缀和”,用于高效计算一个矩阵中任意子矩阵内所有元素的和,这在图像处理、动态规划等算法中非常有用。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













