前缀和算法实战:寻找中心下标与除自身外乘积
前缀和与前缀积是解决数组区间问题的利器。本文将通过两道经典题目,演示如何利用预处理思想将时间复杂度优化至 O(N)。
27. 寻找数组的中心下标
题目链接:
题目描述:

题目示例:

解法思路
所谓中心下标,是指该元素左侧所有数字之和等于右侧所有数字之和。如果不存在这样的下标,返回 -1。
直接暴力枚举每个位置并计算左右和,时间复杂度会达到 O(N^2)。为了优化,我们可以利用前缀和的思想:
- 预处理:构建两个数组,
leftSum记录当前位置左侧的和,rightSum记录当前位置右侧的和。 - 遍历判断:当
leftSum[i] == rightSum[i]时,当前下标即为答案。
注意边界情况:第一个元素的左侧和为 0,最后一个元素的右侧和为 0。
C++ 代码实现
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int n = nums.size();
vector<int> leftSum(n, 0), rightSum(n, 0);
// 计算左侧前缀和
for (int i = 1; i < n; i++) {
leftSum[i] = leftSum[i - ] + nums[i - ];
}
( i = n - ; i >= ; i--) {
rightSum[i] = rightSum[i + ] + nums[i + ];
}
( i = ; i < n; i++) {
(leftSum[i] == rightSum[i]) i;
}
;
}
};




