1991. 找到数组的中间位置
题目描述
给你一个下标从 0 开始的整数数组 nums ,请你找到 最左边 的中间位置 middleIndex (也就是所有可能中间位置下标最小的一个)。
中间位置 middleIndex 是满足 nums[0] + nums[1] + ... + nums[middleIndex-1] == nums[middleIndex+1] + nums[middleIndex+2] + ... + nums[nums.length-1] 的数组下标。
如果 middleIndex == 0 ,左边部分的和定义为 0 。类似的,如果 middleIndex == nums.length - 1 ,右边部分的和定义为 0 。
请你返回满足上述条件 最左边 的 middleIndex ,如果不存在这样的中间位置,请你返回 -1 。
示例 1:
输入:nums = [2,3,-1,8,4] 输出:3 解释: 下标 3 之前的数字和为:2 + 3 + -1 = 4 下标 3 之后的数字和为:4 = 4
示例 2:
输入:nums = [1,-1,4] 输出:2 解释: 下标 2 之前的数字和为:1 + -1 = 0 下标 2 之后的数字和为:0
示例 3:
输入:nums = [2,5] 输出:-1 解释: 不存在符合要求的 middleIndex 。
示例 4:
输入:nums = [1] 输出:0 解释: 下标 0 之前的数字和为:0 下标 0 之后的数字和为:0
提示:
1 <= nums.length <= 100-1000 <= nums[i] <= 1000
注意:本题与主站 724 题相同:https://leetcode.cn/problems/find-pivot-index/
解法
方法一:前缀和
思考
中间下标使左右和相等。预计算总和后从左扫描:先从右侧减去当前值再比较,相等则返回,否则累加到左侧。
避免每次重新求和,空间常数。
我们定义两个变量 \(l\) 和 \(r\),分别表示数组 \(\textit{nums}\) 中下标 \(i\) 左侧元素之和和右侧元素之和。初始时 \(l = 0\),而 \(r = \sum_{i = 0}^{n - 1} nums[i]\)。
我们遍历数组 \(\textit{nums}\),对于当前遍历到的数字 \(x\),我们更新 \(r = r - x\),此时如果 \(l = r\),说明当前下标 \(i\) 就是中间位置,直接返回即可。否则,我们更新 \(l = l + x\),继续遍历下一个数字。
遍历结束,如果没有找到中间位置,返回 \(-1\)。
时间复杂度 \(O(n)\),其中 \(n\) 为数组 \(\textit{nums}\) 的长度。空间复杂度 \(O(1)\)。
相似题目:
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |