64
64
65
65
** 方法一:前缀和**
66
66
67
+ 我们定义变量 $left$ 表示数组 ` nums ` 中下标 $i$ 左侧元素之和,变量 $right$ 表示数组 ` nums ` 中下标 $i$ 右侧元素之和。初始时 $left = 0$, $right = \sum_ {i = 0}^{n - 1} nums[ i] $。
68
+
69
+ 遍历数组 ` nums ` ,对于当前遍历到的数字 $x$,我们更新 $right = right - x$,此时如果 $left=right$,说明当前下标 $i$ 就是中间位置,直接返回即可。否则,我们更新 $left = left + x$,继续遍历下一个数字。
70
+
71
+ 遍历结束,如果没有找到中间位置,返回 $-1$。
72
+
73
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 ` nums ` 的长度。
74
+
75
+ 相似题目:
76
+
77
+ - [ 1991. 找到数组的中间位置] ( /solution/1900-1999/1991.Find%20the%20Middle%20Index%20in%20Array/README.md )
78
+ - [ 2574. 左右元素和的差值] ( /solution/2500-2599/2574.Left%20and%20Right%20Sum%20Differences/README.md )
79
+
67
80
<!-- tabs:start -->
68
81
69
82
### ** Python3**
73
86
``` python
74
87
class Solution :
75
88
def pivotIndex (self , nums : List[int ]) -> int :
76
- s, presum = sum (nums), 0
77
- for i, v in enumerate (nums):
78
- if (presum << 1 ) == s - v:
89
+ left, right = 0 , sum (nums)
90
+ for i, x in enumerate (nums):
91
+ right -= x
92
+ if left == right:
79
93
return i
80
- presum += v
81
- return - 1
82
- ```
83
-
84
- ``` python
85
- class Solution :
86
- def pivotIndex (self , nums : List[int ]) -> int :
87
- l, r = 0 , sum (nums)
88
- for i, v in enumerate (nums):
89
- r -= v
90
- if l == r:
91
- return i
92
- l += v
94
+ left += x
93
95
return - 1
94
96
```
95
97
@@ -100,90 +102,32 @@ class Solution:
100
102
``` java
101
103
class Solution {
102
104
public int pivotIndex (int [] nums ) {
103
- int n = nums. length, s = 0 ;
104
- for (int e : nums) {
105
- s += e;
106
- }
107
- int presum = 0 ;
108
- for (int i = 0 ; i < n; ++ i) {
109
- // presum == sums - nums[i] - presum
110
- if (presum << 1 == s - nums[i]) {
111
- return i;
112
- }
113
- presum += nums[i];
114
- }
115
- return - 1 ;
116
- }
117
- }
118
- ```
119
-
120
- ``` java
121
- class Solution {
122
- public int pivotIndex (int [] nums ) {
123
- int l = 0 , r = 0 ;
124
- for (int v : nums) {
125
- r += v;
126
- }
105
+ int left = 0 , right = Arrays . stream(nums). sum();
127
106
for (int i = 0 ; i < nums. length; ++ i) {
128
- r -= nums[i];
129
- if (l == r ) {
107
+ right -= nums[i];
108
+ if (left == right ) {
130
109
return i;
131
110
}
132
- l += nums[i];
111
+ left += nums[i];
133
112
}
134
113
return - 1 ;
135
114
}
136
115
}
137
116
```
138
117
139
- ### ** TypeScript**
140
-
141
- ``` ts
142
- function pivotIndex(nums : number []): number {
143
- let l = 0 ;
144
- let r = nums .reduce ((a , b ) => a + b , 0 );
145
- for (let i = 0 ; i < nums .length ; ++ i ) {
146
- r -= nums [i ];
147
- if (l == r ) {
148
- return i ;
149
- }
150
- l += nums [i ];
151
- }
152
- return - 1 ;
153
- }
154
- ```
155
-
156
118
### ** C++**
157
119
158
120
``` cpp
159
121
class Solution {
160
122
public:
161
123
int pivotIndex(vector<int >& nums) {
162
- int s = 0;
163
- for (int e : nums)
164
- s += e;
165
- int presum = 0;
124
+ int left = 0, right = accumulate(nums.begin(), nums.end(), 0);
166
125
for (int i = 0; i < nums.size(); ++i) {
167
- if (presum * 2 == s - nums[ i] )
126
+ right -= nums[ i] ;
127
+ if (left == right) {
168
128
return i;
169
- presum += nums[ i] ;
170
- }
171
- return -1;
172
- }
173
- };
174
- ```
175
-
176
- ```cpp
177
- class Solution {
178
- public:
179
- int pivotIndex(vector<int>& nums) {
180
- int l = 0, r = 0;
181
- for (int& v : nums) r += v;
182
- for (int i = 0; i < nums.size(); ++i)
183
- {
184
- r -= nums[i];
185
- if (l == r) return i;
186
- l += nums[i];
129
+ }
130
+ left += nums[ i] ;
187
131
}
188
132
return -1;
189
133
}
@@ -194,35 +138,56 @@ public:
194
138
195
139
```go
196
140
func pivotIndex(nums []int) int {
197
- s := 0
198
- for _ , e := range nums {
199
- s += e
141
+ var left, right int
142
+ for _, x := range nums {
143
+ right += x
200
144
}
201
- presum := 0
202
- for i , e := range nums {
203
- if presum<< 1 == s-e {
145
+ for i, x := range nums {
146
+ right -= x
147
+ if left == right {
204
148
return i
205
149
}
206
- presum += e
150
+ left += x
207
151
}
208
152
return -1
209
153
}
210
154
```
211
155
212
- ``` go
213
- func pivotIndex (nums []int ) int {
214
- l , r := 0 , 0
215
- for _ , v := range nums {
216
- r += v
217
- }
218
- for i , v := range nums {
219
- r -= v
220
- if l == r {
221
- return i
222
- }
223
- l += v
224
- }
225
- return -1
156
+ ### ** JavaScript**
157
+
158
+ ``` js
159
+ /**
160
+ * @param {number[]} nums
161
+ * @return {number}
162
+ */
163
+ var pivotIndex = function (nums ) {
164
+ let left = 0 ,
165
+ right = nums .reduce ((a , b ) => a + b);
166
+ for (let i = 0 ; i < nums .length ; ++ i) {
167
+ right -= nums[i];
168
+ if (left == right) {
169
+ return i;
170
+ }
171
+ left += nums[i];
172
+ }
173
+ return - 1 ;
174
+ };
175
+ ```
176
+
177
+ ### ** TypeScript**
178
+
179
+ ``` ts
180
+ function pivotIndex(nums : number []): number {
181
+ let left = 0 ,
182
+ right = nums .reduce ((a , b ) => a + b );
183
+ for (let i = 0 ; i < nums .length ; ++ i ) {
184
+ right -= nums [i ];
185
+ if (left == right ) {
186
+ return i ;
187
+ }
188
+ left += nums [i ];
189
+ }
190
+ return - 1 ;
226
191
}
227
192
```
228
193
0 commit comments