前缀和
第一题:区间求和:
问题描述
给定一个长度为n的数列a。
随后,有q次讯问。每次讯问中,给定一个起始位置x和终止位置y,希望你求出从第x个数到第y个数的和。
输入格式
第一行包含一个整数n,表示数列的长度。
第二行包含n个不超过1000的非负整数,表示数列a。
第三行包含一个整数q,表示询问个数
随后q行,每行两个正整数x、y表示求和的起始和终止位置。
输出格式
q行,每行一个整数,对应每次求和的答案
样例输入
5
3 5 2 4 1
2
1 3
2 5
样例输出
10
12
样例说明
共有2次求和操作。
第一次求和的结果为3+5+2=10
第二次求和的结果胃5+2+4+1=12
数据规模和约定
n、q<=2000
import java.util.Scanner;
public class 区间求和001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
int n = sc.nextInt();
int num [] = new int[n+1]; //定义原数组 注意从1开始 n+1
int sum []= new int[n+1]; //定义前缀和数组 注意从1开始 n+1
for(int i = 1; i <=n ; i++) {
num[i]=sc.nextInt(); //输入原数组数据
sum[i]=sum[i-1]+num[i]; //求前缀和
}
int q = sc.nextInt(); //输入q次询问
for(int j= 0;j<q;j++) {
int l = sc.nextInt(),r =sc.nextInt(); //输入左边界和右边界
System.out.println(sum[r]-sum[l-1]);
}
}
}
差分数组原理
比如我们现在有一个数组d,d={0,2,5,4,9,7,10,0}
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
d[i] | 0 | 2 | 5 | 4 | 9 | 7 | 10 | 0 |
那么差分数组是什么呢?
其实差分数组本质上也是一个数组,我们暂且定义差分数组为d,差分数组f的大小和原来d数组大小一样,而且f[i]=d[i]-d[i-1] (i≠0)</