使程序在C语言中线性运行
因此,基于以下问题,我创建了解决方案。但是在C语言中,有没有其他方法可以解决线性复杂度为O(N)的问题呢 问题描述: 威廉·麦克法兰想看看阵列 您将得到一个包含N个数字和Q个查询的列表。每个查询都是 由两个数字i和j指定;每个查询的答案是总和 范围[i,j](包括在内)之间的每个数字 注意:使用基于0的索引指定查询范围 输入使程序在C语言中线性运行,c,C,因此,基于以下问题,我创建了解决方案。但是在C语言中,有没有其他方法可以解决线性复杂度为O(N)的问题呢 问题描述: 威廉·麦克法兰想看看阵列 您将得到一个包含N个数字和Q个查询的列表。每个查询都是 由两个数字i和j指定;每个查询的答案是总和 范围[i,j](包括在内)之间的每个数字 注意:使用基于0的索引指定查询范围 输入 第一行包含N,我们列表中的整数数(N您将形成整数数组。修改为: int *array = (int*)malloc(N * sizeof(int)); int *integ
第一行包含N,我们列表中的整数数(N您将形成整数数组。修改为:
int *array = (int*)malloc(N * sizeof(int));
int *integralArray = (int*)malloc(N * sizeof(int));
for (int i = 0; i < N; i++) {
fscanf(input,"%d",&array[i]);
integralArray[i] = array[i] + ((i > 0) ? integralArray[i-1] : 0);
}
int*array=(int*)malloc(N*sizeof(int));
int*integralArray=(int*)malloc(N*sizeof(int));
对于(int i=0;i0)?积分数组[i-1]:0);
}
因此integralArray[i]
处的元素是array
中从0
到i
的所有元素的总和
然后,为了得到从a
到b
的和,其中a>b
,integralArray[b]
是从0
到b
的和,integralArray[a]
是从0
到a
的和,因此您可以只计算integralArray[b]-integralArray[a]
获取从a
到b
的总数。直观地说,integralArray[b]
包括您想要的数字,但也包括a
之前和之后的数字。您不想要这些数字,所以您可以再次将其取下
适当改变以包含或排除
a
处的数字和b
处的数字。给定值将包括b
处的数字,但不包括a
处的数字。您可以将integralArray
调整为早一个(因此integralArray[b]
是从0到b-1的总和)或者调整您的索引。是。预处理。将a[0]+…+a[j]
存储在a[j]。这样您就可以在固定时间内回答查询。您的意思是要替换什么?sum函数?将所有元素的和存储到a[j]
中。这样,当您有查询时,只需返回a[last](first>0?a[first-1]:0)
@dmg这怎么能使它线性化呢?请你再解释一下。我知道你知道,但如果你想给出一个完整的答案!更新后,将行更改为sum=integralArray[last]-(first>0?integralArray[first-1]:0)
那么求和函数呢?我应该把它们放在哪里?对不起我的高贵!但是我真的丢失了我的helfooh和积分数组[I]中的每个元素
是每个查询的和吗?好的,我还是不明白。很抱歉,我不需要这个和函数?而且I
并不总是大于0?我这样写和:sum=integralArray[last]-integralArray[first-1];
因为我们需要[I,j](我不知道我做的是否正确。但是输出不正确。我做错了吗?次要:考虑不同的MALLC风格:<代码> int *数组=Malc(n*sieof of数组);< /代码>。不需要强制转换,IMO更易于编码/维护。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
struct node {
int first;
int last;
};
int sum_array(int *array, int first, int last) {
int sum = 0;
for (int i = first; i <= last; i++) {
sum += array[i];
}
return sum;
}
int main() {
FILE* input = fopen("share.in","r");
int N = 0;
fscanf(input,"%d",&N);
int *array = (int*)malloc(N * sizeof(int));
int *integralArray = (int*)malloc(N * sizeof(int));
for (int i = 0; i < N; i++) {
fscanf(input,"%d",&array[i]);
integralArray[i] = array[i] + ((i > 0) ? array[i-1] : 0);
}
int Q = 0;
fscanf(input,"%d",&Q);
struct node query[Q];
for (int i=0; i < Q; i++) {
fscanf(input,"%d",&query[i].first);
fscanf(input,"%d",&query[i].last);
}
fclose(input);
int sum = 0;
for (int i = 0; i < Q ; i++) {
int first = query[i].first;
int last = query[i].last;
sum = integralArray[last] - integralArray[first - 1];
printf("Number of queries : %d , sum is %d\n",i ,sum);
}
free(array);
return 0;
}
int *array = (int*)malloc(N * sizeof(int));
int *integralArray = (int*)malloc(N * sizeof(int));
for (int i = 0; i < N; i++) {
fscanf(input,"%d",&array[i]);
integralArray[i] = array[i] + ((i > 0) ? integralArray[i-1] : 0);
}