题目链接:58. 区间和(第九期模拟笔试) (kamacoder.com)
题目描述
给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。
输入描述
第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。
输出描述
输出每个指定区间内元素的总和。
输入示例
5
1
2
3
4
5
0 1
1 3
输出示例
3
9
提示信息
数据范围:0 < n <= 100000
思路:
前缀和的思想是重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数。
前缀和 在涉及计算区间和的问题时非常有用!
p[i] 表示 数组下标 0 到 i 的 num[i] 累加 之和。
在num数组上 下标 2 到下标 5 之间的累加和,用 p[5] - p[1] 就可以了。
p[1] =
num[0] +
num[1];
p[5] =
num[0] +
num[1] +
num[2] +
num[3] +
num[4] +
num[5];
p[5] - p[1] =
num[2] +
num[3] +
num[4] +
num[5];
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//代码随想录-数组-7.区间和 前缀和
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] array=new int[n];
int[] p=new int[n];
int presum=0;
for(int i=0;i<n;i++){
array[i]=sc.nextInt();
//p[i]+=array[i];//错误
presum+=array[i];
p[i]=presum;
}
while(sc.hasNextInt()){
int a=sc.nextInt();
int b=sc.nextInt();
int sum=0;
if(a==0){
sum=p[b];
}else{
sum=p[b]-p[a-1];
}
System.out.println(sum);
}
sc.close();
}
}