C语言学习笔记

一、 一维数组前缀

一维数组前缀和:构造一个与原数组长度相同的新数组 pre,prei 表示原数组 arr 中 从第0个元素到第i个元素的所有元素累加和,核心价值是把「区间和查询」的时间复杂度从O(n)降到O(1)。

二、 核心公式(2个必记)

  1. 前缀和数组构建公式

◦ 边界:pre0 = arr0(第一个元素的前缀和就是自身)

◦ 递推:prei = prei-1 + arri(i ≥ 1,当前前缀和 = 前一个前缀和 + 原数组当前元素)

  1. 区间和查询公式(求原数组 l, r 闭区间的和)

◦ sum(l,r) = prer - (l == 0 ? 0 : prel-1)

◦ 简化技巧:若让前缀和数组从下标1开始,公式直接简化为 sum(l,r) = prer - prel-1,无需判断边界,开发中更常用。

三、 2种常用实现(C语言代码)

实现1:下标从0开始(基础版,适配数组默认下标)

#include <stdio.h>int main() {
int arr\[\] = {2, 5, 1, 3, 4}; // 原数组
int n = sizeof(arr)/sizeof(arr0); // 原数组长度
int pren; // 前缀和数组

// 1. 构建前缀和数组

pre0 = arr0;
for (int i = 1; i < n; i++) {
prei = prei-1 + arri;
}

// 2. 查询区间和:比如查 1,3(下标从0开始,对应元素5,1,3)

int l = 1, r = 3;
int sum = prer - prel-1; // l≠0,直接减prel-1

printf("前缀和数组:");
for (int i = 0; i < n; i++) printf("%d ", prei); // 输出:2 7 8 11 15
printf("\n区间%d,%d和:%d", l, r, sum); // 输出:9
return 0;
}

实现2:下标从1开始(实用版,无边界判断)

java 复制代码
#include <stdio.h>

int main() {
    int arr[] = {2, 5, 1, 3, 4};
    int n = sizeof(arr)/sizeof(arr[0]);
    int pre[n+1];  // 前缀和数组长度+1,下标从1开始
    pre[0] = 0;  // 前缀和第0位设为0,作为基准
    
    // 1. 构建前缀和数组
    for (int i = 1; i <= n; i++) {
        pre[i] = pre[i-1] + arr[i-1];  // 原数组下标仍从0开始
    }
    
    // 2. 查询区间和:查原数组[1,3],直接用公式 pre[r]-pre[l-1]
    int l = 2, r = 4;  // 对应原数组下标1-3,前缀和下标同步+1
    int sum = pre[r] - pre[l-1];
    
    printf("前缀和数组:");
    for (int i = 1; i <= n; i++) printf("%d ", pre[i]);  // 输出:2 7 8 11 15
    printf("\n区间和:%d", sum);  // 输出:9
    return 0;
}

四、 核心优势 & 适用场景

  1. 优势:一次构建,多次查询,构建仅需O(n),每次查询仅需O(1),适合频繁查区间和的场景。

  2. 适用场景:数组元素固定(不频繁修改)、频繁求任意区间和(如算法题、统计类需求)。

五、 易错点

  1. 下标混淆:务必区分原数组和前缀和数组的下标对应关系,推荐用下标从1开始的写法,减少错误。

  2. 数组越界:构建前缀和时,循环边界要对应数组长度,避免prei超出数组范围。

  3. 元素修改:若原数组元素频繁修改,前缀和需要重新构建,此时不如直接遍历求和高效。

我可以帮你针对一道具体的区间和算法题,用前缀和写完整解题代码,需要吗?

相关推荐
Jerry14 小时前
LeetCode 739. 每日温度
算法
2601_9545267519 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
qq_4480111619 小时前
C语言中的变量和函数的定义与声明
android·c语言·开发语言
叩码以求索20 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
c238561 天前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa1 天前
指针之总结
c语言·笔记·算法
宵时待雨1 天前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz1 天前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf2161 天前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
agathakuan1 天前
Wireshark 解密並導出TLS 1.2 / TLS 1.3 明文的方法(可控制 Client 端)
c语言·wireshark·ssl·openwrt