一维度前缀和解题通用模板(java)

java 复制代码
public class PrefixSum1D {
    public static void main(String[] args) {
        // 原始数组(下标从1开始,方便计算)
        int[] nums = {0, 3, 1, 4, 1, 5, 9, 2, 6}; // 下标0不用,占位填0

        int n = nums.length - 1; // 实际元素个数(去掉占位的0)

        // ① 建立前缀和数组
        int[] pre = new int[n + 1]; // pre[i] 表示 nums[1..i] 的总和
        pre[0] = 0;                 // 前0个元素的和为0,这是边界

        for (int i = 1; i <= n; i++) {
            pre[i] = pre[i - 1] + nums[i]; // 当前前缀和 = 上一个前缀和 + 当前元素
        }

        // ② 查询区间 [l, r] 的和(下标从1开始)
        // 公式:sum(l, r) = pre[r] - pre[l - 1]
        int l = 2, r = 5;
        int rangeSum = pre[r] - pre[l - 1];
        // pre[5]=14, pre[1]=3, 所以区间[2,5]的和 = 14 - 3 = 11
        System.out.println("区间[" + l + "," + r + "]的和 = " + rangeSum); // 11
    }
}

总结一下

需要做的

1.初始化数据(需要开两个数组)

一个用来存数据(手动填数据,最前面填个0占位,开空间的话就用N+1,多开的1也是给占位0用的,否则会越界)

一个用来存前缀和(这个数组要开N+1,通常在for里面下标从1开始)

2.初始化左右边界值(相当于题目要求的区间范围)

看题目要求

例如:

int l = 2;

int r = 5;

2.核心解题公式

prei = prei - 1 + numsi;

在for里面执行,意思大概是:

当前前缀和 = 上一个前缀和 + 当前元素

int rangeSum = prer - prel - 1;

无需在for中执行,意思大概是:

目标区间和 = 右边界前缀和 - 左边界上一位前缀和

重点!!!

prel-1这里之所以要-1,是因为要确保左边界值不会被剪掉

反面例子,r=5,l=2,题目要求求l,r = 2,5

如果不-1:

(1+2+3+4+5号的和) - (1+2号的和) = 3+4+5号的和

2号直接被吞掉了

相关推荐
星夜离尘566 小时前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
_Evan_Yao6 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
Ai-_Man6 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd6 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼6 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
学逆向的7 小时前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_7 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
thefool1122667 小时前
TCP 1
java·1024程序员节
企业数字化笔记9 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
金銀銅鐵10 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程