寻找数组的中心下标
题目描述: 给定一个整数数组 nums,请找到一个索引位置,使得该位置左侧元素之和等于右侧元素之和。如果存在多个这样的位置,返回最小的那个;如果不存在,返回 -1。
示例: 输入:nums = [1, 7, 3, 6, 5, 6] 输出:3 解释:索引 3 左侧和为 1 + 7 + 3 = 11,右侧和为 5 + 6 = 11。
解法思路
要找到这个'平衡点',核心在于快速计算每个位置左右的和。如果每次遍历都重新求和,时间复杂度会达到 O(N^2)。利用前缀和的思想,我们可以预先计算出每个位置的左侧累积和与右侧累积和,从而将查询降为 O(1)。
具体做法是构建两个辅助数组:
leftSum[i]表示i左侧所有元素的和。rightSum[i]表示i右侧所有元素的和。
遍历数组时,只要发现 leftSum[i] == rightSum[i],当前的 i 就是我们要找的中心下标。
C++ 代码实现
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int n = nums.size();
// f 存储左侧前缀和,g 存储右侧后缀和
vector<int> f(n, 0), g(n, 0);
// 计算左侧前缀和
for (int i = 1; i < n; i++) {
f[i] = f[i - 1] + nums[i - 1];
}
// 计算右侧后缀和
for (int i = n - 2; i >= 0; i--) {
g[i] = g[i + 1] + nums[i + 1];
}
// 查找平衡点
for (int j = ; j < n; j++) {
(f[j] == g[j]) j;
}
;
}
};


