1. 题目背景与核心需求
这道来自牛客网的每日一题"静态区间和(前缀和)"是算法竞赛和编程面试中的经典题型。题目通常会给出一个固定长度的数组,要求快速回答多个区间求和查询。例如给定数组[1,3,5,7,9],查询区间[1,3]的和就是3+5+7=15。
这类问题的暴力解法是直接遍历区间累加,时间复杂度为O(n)每次查询。当查询次数q很大时(比如q=1e5),总时间复杂度O(nq)就会超出时间限制。前缀和算法正是为了解决这个效率痛点而生的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 前缀和算法原理解析
2.1 前缀和数组构建
前缀和的核心思想是预处理一个辅助数组prefix,其中prefix[i]表示原数组前i个元素的和(通常定义prefix[0]=0)。例如:
code复制原数组arr: [1, 3, 5, 7, 9]
前缀和prefix:[0, 1, 4, 9, 16, 25]
构建过程只需要一次线性遍历:
python复制prefix = [0] * (n+1)
for i in range(1, n+1):
prefix[i] = prefix[i-1] + arr[i-1]
2.2 区间和查询原理
有了前缀和数组后,任意区间[l,r]的和可以通过:
code复制sum(l,r) = prefix[r+1] - prefix[l]
这个公式的数学原理很简单:区间和等于前r项和减去前l-1项和。例如查询arr[1..3]:
code复制sum(1,3) = prefix[4] - prefix[1] = 16 - 1 = 15
3. 算法实现与优化技巧
3.1 基础模板代码
python复制n, q = map(int, input().split())
arr = list(map(int, input().split()))
# 构建前缀和数组
prefix = [0] * (n + 1)
for i in range(1, n+1):
prefix[i] = prefix[i-1] + arr[i-1]
# 处理查询
for _ in range(q):
l, r = map(int, input().split())
print(prefix[r] - prefix
