例题:
输入一个长度为 n 的整数序列。
接下来再输入 m 个询问,每个询问输入一对 l,r。
对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。
没学前缀和前:
#include <stdio.h>
int main()
{
int i,n,m,arr[100000]; //n表示数组大小,m表示询问组数,i表示素组下标,arr表示数组范围
scanf("%d%d",&n,&m);
for(i = 0;i < n;i++)
{
scanf("%d",&arr[i]); //输入要求数组
}
int l,r,j = 0,sum =0; //sum为区间和
for(i = 0;i < m;i++)
{
sum =0; //每次求完和之后都要归零
scanf("%d%d",&l,&r); //输入询问的区间范围
for(j = l;j <= r;j++)
{
sum += arr[j-1]; //数组下标从0开始所以-1
}
printf("%d\n",sum);
}
return 0;
}
这样暴力算法的求和时间复杂度为O(n[代表数组的序列数] × q[询问次数])
前缀和 可以降低时间复杂度:
#include <stdio.h>
int main()
{
int a[1000],sum[1000],i,j,n,m,l,r;
scanf("%d%d",&n,&m);
for(i = 0;i < n;i++)
{
scanf("%d",&a[i]);
if(i != 0)
sum[i] = sum[i-1] + a[i];
else
sum[i] = a[i];
}
for(i = 0;i < 3; i&#