Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使程序在C语言中线性运行_C - Fatal编程技术网

使程序在C语言中线性运行

使程序在C语言中线性运行,c,C,因此,基于以下问题,我创建了解决方案。但是在C语言中,有没有其他方法可以解决线性复杂度为O(N)的问题呢 问题描述: 威廉·麦克法兰想看看阵列 您将得到一个包含N个数字和Q个查询的列表。每个查询都是 由两个数字i和j指定;每个查询的答案是总和 范围[i,j](包括在内)之间的每个数字 注意:使用基于0的索引指定查询范围 输入 第一行包含N,我们列表中的整数数(N您将形成整数数组。修改为: int *array = (int*)malloc(N * sizeof(int)); int *integ

因此,基于以下问题,我创建了解决方案。但是在C语言中,有没有其他方法可以解决线性复杂度为O(N)的问题呢

问题描述:

威廉·麦克法兰想看看阵列

您将得到一个包含N个数字和Q个查询的列表。每个查询都是 由两个数字i和j指定;每个查询的答案是总和 范围[i,j](包括在内)之间的每个数字

注意:使用基于0的索引指定查询范围

输入


第一行包含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);
}