前言
前缀和与前缀积是处理数组区间统计的高效技巧。在处理依赖前后缀信息的算法问题时,通过预处理将时间复杂度从 O(N^2) 优化至 O(N)。本文将结合两个经典力扣题目,演示如何运用这一思想解决实际问题。
27. 寻找数组的中心下标
题目描述: 给定一个整数数组 nums,请找到并返回该数组的中心下标。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标不存在或存在多个,则返回最左边的那个。如果不存在这样的下标,返回 -1。

解题思路: 核心在于理解'中心'的定义:左侧和 = 右侧和。 暴力解法是对每个位置都重新计算左右两侧的和,效率较低。我们可以利用前缀和的思想进行优化。
- 预处理:创建两个数组,
leftSum和rightSum(或者直接用变量累加)。这里为了逻辑清晰,我们分别记录当前位置左侧的累加和与右侧的累加和。 - 遍历判断:从左到右遍历数组,对于当前索引 i,如果
leftSum[i] == rightSum[i],则找到了中心下标。 - 边界处理:注意首尾元素的情况,左侧或右侧为空时和为 0。
代码实现:
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int n = nums.size();
// f 存储左侧前缀和,g 存储右侧后缀和
vector<int> f(n, 0), g(n, 0);
// 计算左侧前缀和:f[i] 表示 nums[0]...nums[i-1] 的和
for (int i = 1; i < n; ++i) {
f[i] = f[i - 1] + nums[i - 1];
}
// 计算右侧后缀和:g[i] 表示 nums[i+1]...nums[n-1] 的和
for (int i = n - ; i >= ; --i) {
g[i] = g[i + ] + nums[i + ];
}
( j = ; j < n; ++j) {
(f[j] == g[j]) j;
}
;
}
};



