news 2026/2/16 19:14:34

前缀和与差分:从一维到二维的高效数据操作技巧(Java版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前缀和与差分:从一维到二维的高效数据操作技巧(Java版)

前缀和与差分....

  • 前缀和与差分:从一维到二维的高效数据操作技巧(Java版)
      • 推荐视频:
    • 一、一维前缀和:快速查区间和
      • 题目描述:给定长度为 n的数组,有 q次查询,每次查询区间 [L,R]的元素和,请输出每次查询结果。
      • 核心思想
      • 图片解释
      • 一维前缀和:文字版分解动画
      • 核心Java代码
      • 适用场景
    • 二、一维差分:快速改区间值
      • 题目描述:给定初始全 0 的数组,有 m次操作,每次操作对区间 [L,R]加 k,操作完成后输出最终数组。
      • 核心思想
      • 图片解释
      • 原理:
        • 因为差分数组中,标记位加了一个数还原成原数组的时候,后面的数都会累加,然后在R+1位再减去这个数停止累加!!!
      • 一维差分:文字版分解动画
      • 核心Java代码
      • 适用场景
    • 三、二维前缀和:快速查矩阵子矩形和
      • 题目描述:给定 n×m 的矩阵,有 q次查询,每次查询子矩形 [(x1,y1),(x2,y2)]的元素和,请输出每次查询结果。
      • 核心思想
      • 图片解释
      • 二维前缀和:文字版分解动画
      • 核心Java代码
      • 适用场景
    • 四、二维差分:快速改矩阵子矩形值
      • 题目描述:给定初始全 0 的 n×m矩阵,有 k 次操作,每次操作对子矩形 [(x1,y1),(x2,y2)] 加 val,操作完成后输出最终矩阵。
      • 核心思想
      • 图片解释
      • 二维差分:文字版分解动画
      • 核心Java代码
      • 适用场景
    • 五、核心总结
      • 关键注意点

前缀和与差分:从一维到二维的高效数据操作技巧(Java版)

前缀和与差分是算法中经典的数据预处理技巧,能将数组/矩阵的区间查询、区间修改时间复杂度从O ( n ) O(n)O(n)/O ( n m ) O(nm)O(nm)优化到O ( 1 ) O(1)O(1),是刷题和工程开发中处理区间问题的“利器”。本文从一维到二维,结合Java实战代码,拆解核心逻辑与应用场景。

推荐视频:

前缀和与差分视频【共四集视频】

一、一维前缀和:快速查区间和

题目描述:给定长度为 n的数组,有 q次查询,每次查询区间 [L,R]的元素和,请输出每次查询结果。

核心思想

前缀和数组preSum中,preSum[i]表示原数组前i个元素的和。通过预处理前缀和,任意区间[L, R]的和可通过preSum[R] - preSum[L-1]直接计算(索引从1开始,避免边界处理)。

图片解释


一维前缀和:文字版分解动画

核心Java代码

importjava.util.Scanner;// 一维前缀和核心实现(索引1开始)publicclassPrefixSum1D{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();// 数组长度intq=sc.nextInt();// 查询次数int[]arr=newint[n+1];// 原数组(1-based)// 输入原数组for(inti=1;i<=n;i++){arr[i]=sc.nextInt();}// 构建前缀和数组int[]preSum=newint[n+1];for(inti=1;i<=n;i++){preSum[i]=preSum[i-1]+arr[i];}// 处理查询for(inti=0;i<q;i++){intL=sc.nextInt();intR=sc.nextInt();intsum=preSum[R]-preSum[L-1];System.out.println(sum);}sc.close();}}

适用场景

  • 多次查询数组子区间和(如成绩区间总分、子数组和统计)

二、一维差分:快速改区间值

题目描述:给定初始全 0 的数组,有 m次操作,每次操作对区间 [L,R]加 k,操作完成后输出最终数组。

核心思想

差分是前缀和的逆运算,差分数组diff标记区间修改的“起点”和“终点”:对[L, R]k,只需diff[L] += kdiff[R+1] -= k(多开一位避免越界),最后对diff求前缀和即可还原修改后的数组。

图片解释


原理:

因为差分数组中,标记位加了一个数还原成原数组的时候,后面的数都会累加,然后在R+1位再减去这个数停止累加!!!

一维差分:文字版分解动画

核心Java代码

// 一维差分核心实现(索引1开始)importjava.util.Arrays;importjava.util.Scanner;publicclassDifference1D{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();// 数组长度intm=sc.nextInt();// 操作次数int[]diff=newint[n+2];// 差分数组(多开1位避免越界)// 处理区间修改操作for(inti=0;i<m;i++){intL=sc.nextInt();intR=sc.nextInt();intk=sc.nextInt();diff[L]+=k;diff[R+1]-=k;}// 还原数组(对差分数组求前缀和)int[]res=newint[n];intcur=0;for(inti=1;i<=n;i++){cur+=diff[i];res[i-1]=cur;}// 输出结果System.out.println(Arrays.toString(res).replaceAll("[\\[\\],]",""));sc.close();}}

适用场景

  • 多次批量修改数组区间值(如区间加减、数据批量更新)
  • 蓝桥杯常考:结合差分解决 “区间操作后统计数组特征”(如最大值、平均值)。

三、二维前缀和:快速查矩阵子矩形和

题目描述:给定 n×m 的矩阵,有 q次查询,每次查询子矩形 [(x1,y1),(x2,y2)]的元素和,请输出每次查询结果。

核心思想

二维前缀和数组preSum[i][j]表示以(1,1)为左上角、(i,j)为右下角的矩形和。递推公式需补偿重复累加的区域,子矩形和通过“大减小、加补偿”计算。

图片解释





二维前缀和:文字版分解动画

核心Java代码

importjava.util.Scanner;// 二维前缀和核心实现(索引1开始)publicclassPrefixSum2D{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();// 行数intm=sc.nextInt();// 列数intq=sc.nextInt();// 查询次数// 输入矩阵(1-based)int[][]matrix=newint[n+1][m+1];for(inti=1;i<=n;i++){for(intj=1;j<=m;j++){matrix[i][j]=sc.nextInt();}}// 构建二维前缀和数组int[][]preSum=newint[n+1][m+1];for(inti=1;i<=n;i++){for(intj=1;j<=m;j++){preSum[i][j]=preSum[i-1][j]+preSum[i][j-1]-preSum[i-1][j-1]+matrix[i][j];}}// 处理查询for(inti=0;i<q;i++){intx1=sc.nextInt();inty1=sc.nextInt();intx2=sc.nextInt();inty2=sc.nextInt();// 子矩形和公式:大减小 + 补偿intsum=preSum[x2][y2]-preSum[x1-1][y2]-preSum[x2][y1-1]+preSum[x1-1][y1-1];System.out.println(sum);}sc.close();}}

适用场景

  • 矩阵子区域和查询(如图像局部亮度统计、二维数据区间分析);
  • 蓝桥杯常考:结合二维前缀和解决 “矩阵中子矩形满足条件的数量”“最大子矩形和” 等问题。

四、二维差分:快速改矩阵子矩形值

题目描述:给定初始全 0 的 n×m矩阵,有 k 次操作,每次操作对子矩形 [(x1,y1),(x2,y2)] 加 val,操作完成后输出最终矩阵。

核心思想

二维差分通过4个标记点实现子矩形批量修改:对(x1,y1)-(x2,y2)k,只需修改diff[x1][y1]diff[x1][y2+1]diff[x2+1][y1]diff[x2+1][y2+1],最后对diff求二维前缀和还原矩阵。

图片解释



二维差分:文字版分解动画

核心Java代码

importjava.util.Scanner;// 二维差分核心实现(索引1开始)publicclassDifference2D{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();// 行数intm=sc.nextInt();// 列数intk=sc.nextInt();// 操作次数// 差分数组(多开1行1列,避免越界)int[][]diff=newint[n+2][m+2];// 处理子矩形修改操作for(inti=0;i<k;i++){intx1=sc.nextInt();inty1=sc.nextInt();intx2=sc.nextInt();inty2=sc.nextInt();intval=sc.nextInt();// 二维差分4个标记点diff[x1][y1]+=val;diff[x1][y2+1]-=val;diff[x2+1][y1]-=val;diff[x2+1][y2+1]+=val;}// 还原矩阵(对差分数组求二维前缀和)int[][]res=newint[n+1][m+1];for(inti=1;i<=n;i++){for(intj=1;j<=m;j++){// 求前缀和res[i][j]=res[i-1][j]+res[i][j-1]-res[i-1][j-1]+diff[i][j];// 输出当前行(去掉最后一列的空格)System.out.print(res[i][j]+(j==m?"\n":" "));}}sc.close();}}

适用场景

  • 矩阵子区域批量修改(如图像局部调色、二维数据批量更新);
  • 蓝桥杯常考:结合二维差分解决 “多次矩阵区间操作后统计极值”“矩阵操作后满足条件的子矩形数量” 等问题。

五、核心总结

技巧核心操作时间复杂度(预处理/单次操作)
一维前缀和区间和查询O ( n ) O(n)O(n)/O ( 1 ) O(1)O(1)
一维差分区间批量修改O ( n ) O(n)O(n)/O ( 1 ) O(1)O(1)
二维前缀和子矩形和查询O ( n m ) O(nm)O(nm)/O ( 1 ) O(1)O(1)
二维差分子矩形批量修改O ( n m ) O(nm)O(nm)/O ( 1 ) O(1)O(1)

关键注意点

  1. 索引建议从1开始,避免边界越界问题;
  2. 差分操作后必须通过前缀和还原数组/矩阵;
  3. 二维前缀和/差分需注意“重复区域补偿”逻辑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/12 20:27:17

基于MPPT和PI控制器的光伏蓄电池微电网能量管理系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序或模型 4.系统原理简介 4.1 光伏阵列建模与MPPT控制 4.2 光伏侧Boost变换器 4.3 直流母线电压稳定控制 4.4 电池控制 5.完整工程文件 本文介绍了一个光伏-电池直流微电网仿真系统&#xff0c;采用Matlab2024b实现。系统通过…

作者头像 李华
网站建设 2026/2/16 15:33:21

如何使用CONDA创建python 3.12虚拟环境

使用 conda 创建 Python 3.12 虚拟环境的步骤如下: 1. 确认 Anaconda/Miniconda 已安装 确保你的系统已安装 Anaconda 或 Miniconda。若未安装,可从官网下载: Anaconda:Download Anaconda Distribution | Anaconda Miniconda:https://docs.conda.io/en/latest/miniconda…

作者头像 李华
网站建设 2026/2/8 3:38:12

技术架构思考 | 智能体中的“信息节奏”设计:从认知负荷到渐进式揭示

在智能体系统期阶段,最常见的抱怨是“AI不够聪明,回答不够全面”。随着模型能力显著提升、生成成本快速下降之后,问题开始发生反转:AI 给出的信息越来越多,而用户反而越来越难用。 怎么理解这种转变,AI的回答并不是“信息不足”,而是另一种更隐蔽的问题:用户读不完、记…

作者头像 李华
网站建设 2026/2/10 16:23:05

深度测评MBA必备AI论文工具TOP10:开题报告与文献综述全解析

深度测评MBA必备AI论文工具TOP10&#xff1a;开题报告与文献综述全解析 2026年MBA学术写作工具测评&#xff1a;精准选型助力高效研究 在MBA学习与研究过程中&#xff0c;论文撰写是贯穿始终的核心任务&#xff0c;尤其是开题报告与文献综述环节&#xff0c;往往需要耗费大量时…

作者头像 李华