算法实战:前缀和进阶
在数组处理问题中,前缀和(Prefix Sum)是一种将区间查询优化到 O(1) 的经典技巧。今天我们来深入两个典型场景:寻找数组的中心下标,以及计算除自身以外数组的乘积。这两个问题看似不同,核心都在于利用预处理降低时间复杂度。
27. 寻找数组的中心下标
题目描述: 给定一个整数数组 nums,找到并返回该数组的中心下标。如果不存在,则返回 -1。 中心下标是指左侧所有元素之和等于右侧所有元素之和的下标。

解题思路: 直观的想法是遍历每个位置,分别计算左边和右边的和。但这样会导致 O(N^2) 的复杂度。我们可以利用前缀和的思想进行优化:
- 预处理:构建两个辅助数组。
f[i]存储nums[0]到nums[i-1]的和(即 i 左侧的和),g[i]存储nums[i+1]到nums[n-1]的和(即 i 右侧的和)。 - 枚举判断:遍历数组,当
f[i] == g[i]时,当前下标即为所求。 - 边界处理:注意首尾元素的左右和默认为 0。
代码实现:
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int n = nums.size();
if (n == 0) return -1;
// f[i] 表示 i 左侧所有元素的和
vector<int> f(n, 0);
// g[i] 表示 i 右侧所有元素的和
vector<int> g(n, 0);
// 计算左侧前缀和
for (int i = ; i < n; i++) {
f[i] = f[i - ] + nums[i - ];
}
( i = n - ; i >= ; i--) {
g[i] = g[i + ] + nums[i + ];
}
( j = ; j < n; j++) {
(f[j] == g[j]) {
j;
}
}
;
}
};



