Skip to content

Commit 746daf4

Browse files
authored
feat: add solutions to lcof2 problem: No.012 (#1398)
NO.012.左右两边子数组的和相等
1 parent 6b262f4 commit 746daf4

File tree

7 files changed

+133
-91
lines changed

7 files changed

+133
-91
lines changed

lcof2/剑指 Offer II 012. 左右两边子数组的和相等/README.md

Lines changed: 74 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,20 @@
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63-
用前缀和进行预处理,避免重复计算
63+
**方法一:前缀和**
64+
65+
我们定义变量 $left$ 表示数组 $nums$ 中下标 $i$ 左侧元素之和,变量 $right$ 表示数组 $nums$ 中下标 $i$ 右侧元素之和。初始时 $left = 0$, $right = \sum_{i = 0}^{n - 1} nums[i]$。
66+
67+
遍历数组 $nums$,对于当前遍历到的数字 $x$,我们更新 $right = right - x$,此时如果 $left=right$,说明当前下标 $i$ 就是中间位置,直接返回即可。否则,我们更新 $left = left + x$,继续遍历下一个数字。
68+
69+
遍历结束,如果没有找到中间位置,返回 $-1$。
70+
71+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $nums$ 的长度。
72+
73+
相似题目:
74+
75+
- [1991. 找到数组的中间位置](/solution/1900-1999/1991.Find%20the%20Middle%20Index%20in%20Array/README.md)
76+
- [2574. 左右元素和的差值](/solution/2500-2599/2574.Left%20and%20Right%20Sum%20Differences/README.md)
6477

6578
<!-- tabs:start -->
6679

@@ -71,13 +84,12 @@
7184
```python
7285
class Solution:
7386
def pivotIndex(self, nums: List[int]) -> int:
74-
n = len(nums)
75-
sum = [0 for _ in range(n + 1)]
76-
for i in range(1, n + 1):
77-
sum[i] = sum[i - 1] + nums[i - 1]
78-
for i in range(0, n):
79-
if sum[i] == sum[n] - sum[i + 1]:
87+
left, right = 0, sum(nums)
88+
for i, x in enumerate(nums):
89+
right -= x
90+
if left == right:
8091
return i
92+
left += x
8193
return -1
8294
```
8395

@@ -88,59 +100,79 @@ class Solution:
88100
```java
89101
class Solution {
90102
public int pivotIndex(int[] nums) {
91-
int n = nums.length;
92-
int[] sum = new int[n + 1];
93-
for (int i = 1; i <= n; i++) {
94-
sum[i] = sum[i - 1] + nums[i - 1];
103+
int left = 0, right = 0;
104+
for (int x : nums) {
105+
right += x;
95106
}
96-
for (int i = 0; i < n; i++) {
97-
if (sum[i] == sum[n] - sum[i + 1]) {
107+
int n = nums.length;
108+
for (int i = 0; i < n; ++i) {
109+
right -= nums[i];
110+
if (left == right) {
98111
return i;
99112
}
113+
left += nums[i];
100114
}
101115
return -1;
102116
}
103117
}
104118
```
105119

120+
### **C++**
121+
122+
```cpp
123+
class Solution {
124+
public:
125+
int pivotIndex(vector<int>& nums) {
126+
int left = 0;
127+
int right = accumulate(nums.begin(), nums.end(), 0);
128+
int n = nums.size();
129+
for (int i = 0; i < n; ++i) {
130+
right -= nums[i];
131+
if (left == right) {
132+
return i;
133+
}
134+
left += nums[i];
135+
}
136+
return -1;
137+
}
138+
};
139+
```
140+
106141
### **Go**
107142
108143
```go
109144
func pivotIndex(nums []int) int {
110-
n := len(nums)
111-
sum := make([]int, n+1)
112-
for i := 1; i <= n; i++ {
113-
sum[i] = sum[i-1] + nums[i-1]
145+
left, right := 0, 0
146+
for _, x := range nums {
147+
right += x
114148
}
115-
for i := 0; i < n; i++ {
116-
if sum[i] == sum[n]-sum[i+1] {
149+
for i, x := range nums {
150+
right -= x
151+
if left == right {
117152
return i
118153
}
154+
left += x
119155
}
120156
return -1
121157
}
122158
```
123159

124-
### **C++**
125-
126-
```cpp
127-
class Solution {
128-
public:
129-
int pivotIndex(vector<int>& nums) {
130-
int sum = 0;
131-
int total = 0;
132-
for (int num : nums)
133-
sum += num;
134-
135-
for (int i = 0; i < nums.size(); i++) {
136-
total += nums[i];
137-
if (total - nums[i] == sum - total)
138-
return i;
160+
### **TypeScript**
161+
162+
```ts
163+
function pivotIndex(nums: number[]): number {
164+
let left = 0;
165+
let right = nums.reduce((a, b) => a + b, 0);
166+
const n = nums.length;
167+
for (let i = 0; i < n; ++i) {
168+
right -= nums[i];
169+
if (left === right) {
170+
return i;
139171
}
140-
141-
return -1;
172+
left += nums[i];
142173
}
143-
};
174+
return -1;
175+
}
144176
```
145177

146178
### **PHP**
@@ -152,16 +184,14 @@ class Solution {
152184
* @return Integer
153185
*/
154186
function pivotIndex($nums) {
155-
$sum = 0;
156-
$pre = 0;
157-
for ($i = 0; $i < count($nums); $i++) {
158-
$sum += $nums[$i];
159-
}
187+
$left = 0;
188+
$right = array_sum($nums);
160189
for ($i = 0; $i < count($nums); $i++) {
161-
if ($pre === $sum - $pre - $nums[$i]) {
190+
$right -= $nums[$i];
191+
if ($left == $right) {
162192
return $i;
163193
}
164-
$pre += $nums[$i];
194+
$left += $nums[$i];
165195
}
166196
return -1;
167197
}
Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
class Solution {
22
public:
33
int pivotIndex(vector<int>& nums) {
4-
int sum = 0;
5-
int total = 0;
6-
for (int num : nums)
7-
sum += num;
8-
9-
for (int i = 0; i < nums.size(); i++) {
10-
total += nums[i];
11-
if (total - nums[i] == sum - total)
4+
int left = 0;
5+
int right = accumulate(nums.begin(), nums.end(), 0);
6+
int n = nums.size();
7+
for (int i = 0; i < n; ++i) {
8+
right -= nums[i];
9+
if (left == right) {
1210
return i;
11+
}
12+
left += nums[i];
1313
}
14-
1514
return -1;
1615
}
1716
};
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
func pivotIndex(nums []int) int {
2-
n := len(nums)
3-
sum := make([]int, n+1)
4-
for i := 1; i <= n; i++ {
5-
sum[i] = sum[i-1] + nums[i-1]
2+
left, right := 0, 0
3+
for _, x := range nums {
4+
right += x
65
}
7-
for i := 0; i < n; i++ {
8-
if sum[i] == sum[n]-sum[i+1] {
6+
for i, x := range nums {
7+
right -= x
8+
if left == right {
99
return i
1010
}
11+
left += x
1112
}
1213
return -1
1314
}
Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
class Solution {
2-
public int pivotIndex(int[] nums) {
3-
int n = nums.length;
4-
int[] sum = new int[n + 1];
5-
for (int i = 1; i <= n; i++) {
6-
sum[i] = sum[i - 1] + nums[i - 1];
7-
}
8-
for (int i = 0; i < n; i++) {
9-
if (sum[i] == sum[n] - sum[i + 1]) {
10-
return i;
11-
}
12-
}
13-
return -1;
14-
}
15-
}
1+
class Solution {
2+
public int pivotIndex(int[] nums) {
3+
int left = 0, right = 0;
4+
for (int x : nums) {
5+
right += x;
6+
}
7+
int n = nums.length;
8+
for (int i = 0; i < n; ++i) {
9+
right -= nums[i];
10+
if (left == right) {
11+
return i;
12+
}
13+
left += nums[i];
14+
}
15+
return -1;
16+
}
17+
}

lcof2/剑指 Offer II 012. 左右两边子数组的和相等/Solution.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@ class Solution {
44
* @return Integer
55
*/
66
function pivotIndex($nums) {
7-
$sum = 0;
8-
$pre = 0;
7+
$left = 0;
8+
$right = array_sum($nums);
99
for ($i = 0; $i < count($nums); $i++) {
10-
$sum += $nums[$i];
11-
}
12-
for ($i = 0; $i < count($nums); $i++) {
13-
if ($pre === $sum - $pre - $nums[$i]) {
10+
$right -= $nums[$i];
11+
if ($left == $right) {
1412
return $i;
1513
}
16-
$pre += $nums[$i];
14+
$left += $nums[$i];
1715
}
1816
return -1;
1917
}
Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
class Solution:
2-
def pivotIndex(self, nums: List[int]) -> int:
3-
n = len(nums)
4-
sum = [0 for _ in range(n + 1)]
5-
for i in range(1, n + 1):
6-
sum[i] = sum[i - 1] + nums[i - 1]
7-
for i in range(0, n):
8-
if sum[i] == sum[n] - sum[i + 1]:
9-
return i
10-
return -1
1+
class Solution:
2+
def pivotIndex(self, nums: List[int]) -> int:
3+
left, right = 0, sum(nums)
4+
for i, x in enumerate(nums):
5+
right -= x
6+
if left == right:
7+
return i
8+
left += x
9+
return -1
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function pivotIndex(nums: number[]): number {
2+
let left = 0;
3+
let right = nums.reduce((a, b) => a + b, 0);
4+
const n = nums.length;
5+
for (let i = 0; i < n; ++i) {
6+
right -= nums[i];
7+
if (left === right) {
8+
return i;
9+
}
10+
left += nums[i];
11+
}
12+
return -1;
13+
}

0 commit comments

Comments
 (0)