C语言数组区间求和算法优化与实现
C语言数组区间求和算法优化与实现
本文介绍如何使用C语言实现高效的数组区间求和算法。我们将会利用前缀和的技巧来优化查询效率,并提供完整的代码示例和详细的解释。
问题描述:
给定一个包含n个整数的数组a,以及m个查询。每个查询包含两个整数l和r,要求计算数组a中下标从l到r(包含l和r)的所有元素的和。
算法思路:
-
前缀和计算: - 创建一个新的数组s,大小为n+1。 - s[i] 表示数组a中前i个元素的和,即 s[i] = a[1] + a[2] + ... + a[i]。 - 特别地,s[0] = 0。
-
区间和查询: - 对于每个查询(l, r),数组a中下标从l到r的元素之和可以通过如下公式计算: -
s[r] - s[l-1]
**代码实现:**c#include <stdio.h>
int main() { const int N = 100010; int n, m; int l, r; int i; int a[N]; int s[N];
// 读取数组长度和查询次数 scanf('%d %d', &n, &m);
// 读取数组元素 for (i = 1; i <= n; i++) { scanf('%d', &a[i]); }
// 计算前缀和 s[0] = 0; for (i = 1; i <= n; i++) { s[i] = s[i - 1] + a[i]; }
// 处理查询 for (i = 1; i <= m; i++) { // 读取查询区间 scanf('%d %d', &l, &r);
// 计算区间和并输出 printf('%d
', s[r] - s[l-1]); }
return 0;}
代码解释:
- 我们首先定义了一些必要的变量,包括数组大小
N,数组长度n,查询次数m,查询区间左右端点l和r,循环变量i,存放数组元素的数组a,以及存放前缀和的数组s。2. 接下来,我们读取数组长度n和查询次数m。3. 然后,我们使用一个循环读取数组元素并存储到数组a中。4. 接下来,我们计算数组a的前缀和并存储到数组s中。注意,s[0]被初始化为0,因为它是计算前缀和的基础。5. 最后,我们使用一个循环处理每个查询。对于每个查询,我们首先读取查询区间左右端点l和r,然后根据公式s[r] - s[l-1]计算区间和并输出。
总结:
通过使用前缀和的技巧,我们可以将每次区间求和的时间复杂度从O(n)降低到O(1),从而提高了查询效率。这种优化在处理大量查询时尤为重要。
原文地址: https://www.cveoy.top/t/topic/bdY5 著作权归作者所有。请勿转载和采集!