前缀和
什么是前缀和
[1,2,3,4,5]
[1,3,6,10,15]
有什么用
了解了前缀和之后,我的第一反应是有什么用,算数组区间的和可以用来做什么。
快速求数组中一段的和
省略了一个循环遍历的过程o(n)。
其实也就查询的时候的有优势,相当于一次运算,一次遍历,不用重复计算所有。
例子
输入一个长度为n
的整数序列。接下来再输入m
个询问,每个询问输入一对l
, r
。对于每个询问,输出原序列中从第l
个数到第r
个数的和。
暴力解法——遍历求和
private static int sumOfRange(int[] arr, int l, int r) {
int sum = 0;
for (int i = l; i <= r; i++) {
sum += arr[i];
}
return sum;
}
前缀和解法
package 前缀和;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//n m
//str
//l r
public class PrefixSum_ {
public static void main(String[] args) throws IOException {
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(in);
// 读取第一行输入并分割
String[] str = br.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int m = Integer.parseInt(str[1]);
// 读取第二行输入并分割
String[] str1 = br.readLine().split(" ");
int[] arrgs = new int[n];
for (int i = 0; i < n; i++) {
arrgs[i] = Integer.parseInt(str1[i]);
}
// 计算前缀和
int[] prefixSum = new int[n + 1];
for (int i = 0; i < n; i++) {
prefixSum[i + 1] = prefixSum[i] + arrgs[i];
}
// 处理每个查询
for (int i = 0; i < m; i++) {
str = br.readLine().split(" ");
int l = Integer.parseInt(str[0]);
int r = Integer.parseInt(str[1]);
// 输出查询区间的和
System.out.println(prefixSum[r] - prefixSum[l - 1]);
}
}
}