Go语言怎么做前缀和_Go语言前缀和算法教程【进阶】
Go中一维前缀和需用make([]int, n1)创建prefix[0]0递推prefix[i]prefix[i-1]nums[i-1]使区间[l,r]和为prefix[r1]-prefix[l]二维同理prefixi表示前i行j列和递推公式为“上左?左上当前”查矩形用prefixr21?prefixr1?prefixr21prefixr1。Go 语言里怎么写一维前缀和数组直接用 make([]int, n1) 开个长度为 n1 的切片索引从 0 开始prefix[0] 0然后遍历原数组递推填值prefix[i] prefix[i-1] nums[i-1]。这样设计是为了让区间 [l, r]闭区间的和能用 prefix[r1] - prefix[l] 一步算出不用额外判断边界。常见错误是把 prefix 长度开成 n结果 r1 越界或者初始化时漏掉 prefix[0] 0导致所有查询偏移错位。原数组下标从 0 开始前缀和数组下标对应「前 i 个元素之和」所以必须多留一位如果后续要频繁查区间和且原数组不变这个预处理 O(n) 换来每次 O(1) 查询非常划算注意Go 切片底层数组可能被复用别把 prefix 直接传给会修改它的函数除非你明确知道在改什么二维前缀和怎么初始化matrix[i][j] 对应 prefix[i1][j1]二维本质是一维的推广核心仍是补零对齐定义 prefix 为 [][]int尺寸 (m1) x (n1)其中 prefix[i][j] 表示从 matrix[0][0] 到 matrix[i-1][j-1] 的子矩阵和。递推公式是prefix[i][j] prefix[i-1][j] prefix[i][j-1] - prefix[i-1][j-1] matrix[i-1][j-1]。最容易踩的坑是行列下标没统一偏移比如混用 i 和 i-1 导致加错位置或者忘记减去重叠部分 prefix[i-1][j-1]结果整个矩阵和翻倍。立即学习“go语言免费学习笔记深入”记住口诀「上 左 ? 左上 当前」顺序不能乱查矩形 [r1, c1] ~ [r2, c2]闭区间时用 prefix[r21][c21] - prefix[r1][c21] - prefix[r21][c1] prefix[r1][c1]如果矩阵很大且稀疏前缀和反而浪费内存此时考虑离散化 树状数组更合适前缀和能和 slice 原地操作共存吗不能直接复用原数组空间做前缀和除非你确定后续再也不需要原始值。Go 的 []int 是引用类型一旦你把 nums 改成前缀形式所有依赖原始值的地方都会出错——比如你后来还想取 nums[3]它已经不是原来那个数了。 Mokker AI AI产品图添加背景