前缀和算法实战:中心下标与数组乘积
在算法面试中,前缀和(Prefix Sum)及其变体是高频考点。今天我们来深入探讨两个经典题目:寻找数组的中心下标以及计算除自身以外数组的乘积。这两个问题都可以通过预处理左右两侧的信息,将时间复杂度优化到 O(n)。
一、寻找数组的中心下标
题目描述: 给定一个整数数组 nums,找到索引 index,使得该索引左侧元素之和等于右侧元素之和。如果不存在这样的索引,返回 -1。如果有多个,返回最左边的一个。
算法思路
根据定义,中心下标 i 满足:sum(nums[0...i-1]) == sum(nums[i+1...n-1])。
我们可以利用前缀和的思想来解决。先计算出每个位置左侧的和与右侧的和,然后遍历判断是否相等。
为了节省空间,其实也可以只计算总和,遍历时用 total_sum - current_sum - nums[i] 来代表右侧和,但为了逻辑清晰,这里展示使用两个辅助数组的方法,方便理解核心思想。
代码实现
C++ 实现
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);
// 预处理前缀和:f[i] = f[i-1] + nums[i-1]
for (int i = 1; i < n; i++) {
f[i] = f[i - 1] + nums[i - 1];
}
// 预处理后缀和:g[i] = g[i+1] + nums[i+1]
for (int i = n - 2; i >= ; i--) {
g[i] = g[i + ] + nums[i + ];
}
( i = ; i < n; i++) {
(f[i] == g[i]) {
i;
}
}
;
}
};


