一、724. 寻找数组的中心下标
题目解析
这道题,给定数组
nums,要求我们找出这个数组的中心下标。**中心下标:**指左侧所有元素的和等于右侧所有元素的和。
如果存在多个中心数组下标,就返回最左侧的中心数组下标。
算法思路
暴力解法:
对于这道题,要找出数组的中心下标,暴力解法就是遍历数组,依次判断该位置中心下标(左侧所有元素等于右侧所有元素)。
对于暴力解法,遍历数组 nums;
遍历到 i 位置时,判断该位置是否是中心下标,也就是该位置左侧所有元素是否等于右侧所有元素。
优化:
暴力解法要遍历数组,遍历到 i 位置时还需求左侧所有元素的和、右侧所有元素的和,就还需再遍历数组来求。
时间复杂度就是 O(n);对于遍历数组的每一个元素,依次判断该位置是否是中心下标,这里进行不了优化;
那就来看:遍历到 i 位置时,求左侧所有元素的和、右侧所有元素的和
在暴力解法中,我们就遍历
i位置左侧的所有元素,求左侧所有元素的和;遍历i位置右侧所有元素的和,求右侧所有元素的和。我们可不可以使用更简单的方法来拿到
i位置所有元素的和?
当然是可以的,我们可以预先处理前缀和与后缀和数组,这样就可以以 O(1) 的时间复杂度拿到 i 位置左侧所有元素的和、i 位置右侧所有元素的和。
**前缀和:**预处理前缀和、后缀和数组:遍历到
i位置时需要i位置前面所有元素的和,i位置后面所有元素的和;这里预先处理前缀和数组f和后缀和数组g前缀和数组
f:f[i]表示区间[0,i-1]中所有元素的和。(i位置前面所有元素的和)后缀和数组
g:g[i]表示区间[i+1 , n-1]中所有元素的和。(i位置后面所有元素的和)**使用前缀和、后缀和数组:**有了前缀和、后缀和数组,在遍历到
i位置时只需判断f[i]是否等于g[i]即可。如果f[i] == g[i],就表示i位置是一个中心位置,返回该位置下标i即可。如果f[i] != g[i],就表示i位置不是应该中心位置,继续向后遍历即可。预处理前缀和:
这里
f[i]表示的是 中所有元素的和,所以在填表时从 开始向后填表;


