58. 区间和(第九期模拟笔试) (kamacoder.com)
题目描述
给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。
输入描述
第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。
输出描述
输出每个指定区间内元素的总和。
输入示例
5
1
2
3
4
5
0 1
1 3
输出示例
3
9
解题
解法一:简单粗暴
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n,a,b;
cin>>n;//输出数组长度
vector<int>vec(n);
//将数据输入数组中
for(int i=0;i<n;i++){
cin>>vec[i];
}
//计算区间和
while(cin>>a>>b){
int sum=0;
for(int j=a;j<=b;j++){
sum+=vec[j];
}
cout<<sum<<endl;
}
}
但是会超过时间 当查询量较大时 时间复杂度比较高
解法二:计算前缀和
前缀和的思想是重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数。
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n,a,b,accum=0;
cin>>n;//输出数组长度
vector<int>vec(n);
vector<int>pre(n);
for(int i=0;i<n;i++){
cin>>vec[i];
pre[i]=vec[i]+accum;
accum+=vec[i];
}
while(cin>>a>>b){
if(a==0){
cout<<pre[b]<<endl;
}else{
cout<<pre[b]-pre[a-1]<<endl;
}
}
}
pre[i]记录了vec数组中从vec[0]到vec[i]的数据之和
例如要计算区间3-5的区间和 例如vec={1,2,3,4,5,6} 区间3-5就是{4,5,6}
这等于pre[5]-pre[2]
所以sum=pre[b]-pre[a-1];
注意到a==0时的特殊情况