|
| 1 | +# [1991. 找到数组的中间位置](https://leetcode.cn/problems/find-the-middle-index-in-array/) |
| 2 | + |
| 3 | +- 标签:数组、前缀和 |
| 4 | +- 难度:简单 |
| 5 | + |
| 6 | +## 题目大意 |
| 7 | + |
| 8 | +**描述**:给定一个下标从 0ドル$ 开始的整数数组 $nums$。 |
| 9 | + |
| 10 | +**要求**:返回最左边的中间位置 $middleIndex$(也就是所有可能中间位置下标做小的一个)。如果找不到这样的中间位置,则返回 $-1$。 |
| 11 | + |
| 12 | +**说明**: |
| 13 | + |
| 14 | +- **中间位置 $middleIndex$**:满足 $nums[0] + nums[1] + ... + nums[middleIndex - 1] == nums[middleIndex + 1] + nums[middleIndex + 2] + ... + nums[nums.length - 1]$ 的数组下标。 |
| 15 | +- 如果 $middleIndex == 0,ドル左边部分的和定义为 0ドル$。类似的,如果 $middleIndex == nums.length - 1,ドル右边部分的和定义为 0ドル$。 |
| 16 | + |
| 17 | +**示例**: |
| 18 | + |
| 19 | +- 示例 1: |
| 20 | + |
| 21 | +```Python |
| 22 | +输入:nums = [2,3,-1,8,4] |
| 23 | +输出:3 |
| 24 | +解释: |
| 25 | +下标 3 之前的数字和为:2 + 3 + -1 = 4 |
| 26 | +下标 3 之后的数字和为:4 = 4 |
| 27 | +``` |
| 28 | + |
| 29 | +- 示例 2: |
| 30 | + |
| 31 | +```Python |
| 32 | +输入:nums = [1,-1,4] |
| 33 | +输出:2 |
| 34 | +解释: |
| 35 | +下标 2 之前的数字和为:1 + -1 = 0 |
| 36 | +下标 2 之后的数字和为:0 |
| 37 | +``` |
| 38 | + |
| 39 | +## 解题思路 |
| 40 | + |
| 41 | +### 思路 1:前缀和 |
| 42 | + |
| 43 | +1. 先遍历一遍数组,求出数组中全部元素和为 $total$。 |
| 44 | +2. 再遍历一遍数组,使用变量 $prefix\underline{}sum$ 为前 $i$ 个元素和。 |
| 45 | +3. 当遍历到第 $i$ 个元素时,其数组左侧元素之和为 $prefix\underline{}sum,ドル右侧元素和为 $total - prefix\underline{}sum - nums[i]$。 |
| 46 | + 1. 如果左右元素之和相等,即 $prefix\underline{}sum == total - prefix\underline{}sum - nums[i]$(2ドル \times prefix\underline{}sum + nums[i] == total$) 时,$i$ 为中间位置。此时返回 $i$。 |
| 47 | + 2. 如果不满足,则继续累加当前元素到 $prefix\underline{}sum$ 中,继续向后遍历。 |
| 48 | +4. 如果找不到符合要求的中间位置,则返回 $-1$。 |
| 49 | + |
| 50 | +### 思路 1:代码 |
| 51 | + |
| 52 | +```Python |
| 53 | +class Solution: |
| 54 | + def findMiddleIndex(self, nums: List[int]) -> int: |
| 55 | + total = sum(nums) |
| 56 | + |
| 57 | + prefix_sum = 0 |
| 58 | + for i in range(len(nums)): |
| 59 | + if 2 * prefix_sum + nums[i] == total: |
| 60 | + return i |
| 61 | + prefix_sum += nums[i] |
| 62 | + |
| 63 | + return -1 |
| 64 | +``` |
| 65 | + |
| 66 | +### 思路 1:复杂度分析 |
| 67 | + |
| 68 | +- **时间复杂度**:$O(n)$。 |
| 69 | +- **空间复杂度**:$O(1)$。 |
| 70 | + |
0 commit comments