算法实战:前缀和技巧解中心下标与数组乘积问题
27. 寻找数组的中心下标
题目描述
给定一个整数数组 nums,请编写一个算法返回该数组的「中心下标」。
数组的「中心下标」是指数组中满足以下条件的索引:
- 该索引左侧所有元素之和等于右侧所有元素之和。
- 如果不存在这样的索引,返回
-1。
解题思路
这道题的核心在于找到数组中一个索引,使得该索引左侧所有元素之和等于右侧所有元素之和。
直观的想法是遍历每个位置,分别计算左右两边的和,但这样会导致 O(N²) 的时间复杂度。为了优化到 O(N),我们可以利用前缀和的思想。
核心逻辑:
- 预处理出两个数组:
f[i]:表示索引i左侧所有元素的和(前缀和)。g[i]:表示索引i右侧所有元素的和(后缀和)。
- 遍历数组,判断
f[j] == g[j]是否成立。 - 若相等,则
j即为中心下标;若遍历结束未找到,返回-1。
注意:对于边界情况,最左侧元素的左侧和为 0,最右侧元素的右侧和也为 0。
C++ 代码实现
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int n = nums.size();
vector<int> f(n), g(n);
// f[0] 默认为 0,无需显式赋值
for (int i = 1; i < n; i++) {
f[i] = f[i - 1] + nums[i - 1];
}
// g[n-1] 默认为 0,无需显式赋值
for (int i = n - 2; i >= 0; i--) {
g[i] = g[i + 1] + nums[i + ];
}
( j = ; j < n; j++) {
(f[j] == g[j]) {
j;
}
}
;
}
};


