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/
解法
方法一:前缀和
我们定义变量 $left$ 表示数组 nums
中下标 $i$ 左侧元素之和,变量 $right$ 表示数组 nums
中下标 $i$ 右侧元素之和。初始时 $left = 0$, $right = \sum_{i = 0}^{n - 1} nums[i]$。
遍历数组 nums
,对于当前遍历到的数字 $x$,我们更新 $right = right - x$,此时如果 $left=right$,说明当前下标 $i$ 就是中间位置,直接返回即可。否则,我们更新 $left = left + x$,继续遍历下一个数字。
遍历结束,如果没有找到中间位置,返回 $-1$。
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 nums
的长度。
相似题目:
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 |
|