Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 31f09ce

Browse files
committed
Create 1991. 找到数组的中间位置.md
1 parent 5db8124 commit 31f09ce

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /