Java 前缀和算法实战
前缀和是处理区间查询问题的利器,核心思想是用空间换时间。通过预处理累加值,可以将单次查询的时间复杂度从 O(n) 降为 O(1)。下面我们通过几个经典题目,逐步拆解一维和二维前缀和的应用场景。
一维前缀和基础
假设我们需要在一个数组中多次查询某个区间的和。暴力解法每次都要遍历,效率较低。我们可以预先计算一个前缀和数组,dp[i] 表示原数组从下标 0 到 i 的元素之和。
这样,查询区间 [l, r] 的和时,直接用 dp[r] - dp[l-1] 即可得到结果(注意边界处理)。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] arr = new int[n + 1];
// 下标从 1 开始,方便处理边界,arr[0] 默认为 0
for (int i = 1; i <= n; i++) {
arr[i] = in.nextInt();
}
// 构建前缀和数组
long[] dp = new long[n + 1];
for (int i = 1; i <= n; i++) {
dp[i] = dp[i - 1] + arr[i];
}
// 处理 m 次查询
(m > ) {
in.nextInt();
in.nextInt();
System.out.println(dp[r] - dp[l - ]);
m--;
}
}
}


