Skip to content

Commit 68b6993

Browse files
committed
feat: add solutions to lc problem: No.1664
No.1664.Ways to Make a Fair Array
1 parent ecc9aa7 commit 68b6993

File tree

7 files changed

+181
-158
lines changed

7 files changed

+181
-158
lines changed

solution/1600-1699/1664.Ways to Make a Fair Array/README.md

Lines changed: 66 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,19 @@
6464

6565
<!-- 这里可写通用的实现逻辑 -->
6666

67-
**方法一:预处理 + 枚举**
67+
**方法一:枚举 + 前缀和**
6868

69-
我们先预处理得到数组 `nums` 的奇数下标元素之和 $x$ 以及偶数下标元素之和 $y$。
69+
我们先预处理得到数组 `nums` 的偶数下标元素之和 $s_1$ 以及奇数下标元素之和 $s_2$。
7070

71-
然后从前往后枚举数组 `nums` 的每个元素 $v$,用变量 $a$ 和 $b$ 分别记录已遍历的奇数下标元素之和以及偶数下标元素之和
71+
然后从前往后枚举数组 `nums` 的每个元素 $v$,用变量 $t_1$ 和 $t_2$ 分别记录已遍历的偶数下标元素之和以及奇数下标元素之和
7272

7373
我们观察发现,对于当前遍历到的元素 $v$,如果删除了,那么该元素之后的奇偶下标元素之和会发生交换。此时,我们先判断该位置下标 $i$ 是奇数还是偶数。
7474

75-
如果是奇数下标,删除该元素后,数组的偶数下标元素之和为 $x-v-a+b$,而奇数下标元素之和为 $y-b+a$,如果这两个和相等,那么就是一个平衡数组,答案加一。
75+
- 如果是偶数下标,删除该元素后,数组的奇数下标元素之和为 $t_2 + s_1 - t_1 - v$,而偶数下标元素之和为 $t_1 + s_2 - t_2$,如果这两个和相等,那么就是一个平衡数组,答案加一。
7676

77-
如果是偶数下标,删除该元素后,数组的奇数下标元素之和为 $y-v-b+a$,而偶数下标元素之和为 $x-a+b$,如果这两个和相等,那么就是一个平衡数组,答案加一。
77+
- 如果是奇数下标,删除该元素后,数组的偶数下标元素之和为 $t_1 + s_2 - t_2 - v$,而奇数下标元素之和为 $t_2 + s_1 - t_1$,如果这两个和相等,那么就是一个平衡数组,答案加一。
7878

79-
然后我们更新 $a$ 和 $b$,继续遍历下一个元素。
80-
81-
遍历完数组后,即可得到答案。
79+
然后我们更新 $t_1$ 和 $t_2$,继续遍历下一个元素。遍历完数组后,即可得到答案。
8280

8381
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
8482

@@ -91,18 +89,13 @@
9189
```python
9290
class Solution:
9391
def waysToMakeFair(self, nums: List[int]) -> int:
94-
x, y = sum(nums[1::2]), sum(nums[::2])
95-
ans = 0
96-
a = b = 0
92+
s1, s2 = sum(nums[::2]), sum(nums[1::2])
93+
ans = t1 = t2 = 0
9794
for i, v in enumerate(nums):
98-
if (i & 1) and x - v - a + b == y - b + a:
99-
ans += 1
100-
elif (i & 1) == 0 and y - v - b + a == x - a + b:
101-
ans += 1
102-
if i & 1:
103-
a += v
104-
else:
105-
b += v
95+
ans += i % 2 == 0 and t2 + s1 - t1 - v == t1 + s2 - t2
96+
ans += i % 2 == 1 and t2 + s1 - t1 == t1 + s2 - t2 - v
97+
t1 += v if i % 2 == 0 else 0
98+
t2 += v if i % 2 == 1 else 0
10699
return ans
107100
```
108101

@@ -113,29 +106,20 @@ class Solution:
113106
```java
114107
class Solution {
115108
public int waysToMakeFair(int[] nums) {
109+
int s1 = 0, s2 = 0;
116110
int n = nums.length;
117-
int x = 0, y = 0;
118111
for (int i = 0; i < n; ++i) {
119-
if (i % 2 == 1) {
120-
x += nums[i];
121-
} else {
122-
y += nums[i];
123-
}
112+
s1 += i % 2 == 0 ? nums[i] : 0;
113+
s2 += i % 2 == 1 ? nums[i] : 0;
124114
}
115+
int t1 = 0, t2 = 0;
125116
int ans = 0;
126-
int a = 0, b = 0;
127117
for (int i = 0; i < n; ++i) {
128118
int v = nums[i];
129-
if (i % 2 == 1 && x - v - a + b == y - b + a) {
130-
++ans;
131-
} else if (i % 2 == 0 && y - v - b + a == x - a + b) {
132-
++ans;
133-
}
134-
if (i % 2 == 1) {
135-
a += v;
136-
} else {
137-
b += v;
138-
}
119+
ans += i % 2 == 0 && t2 + s1 - t1 - v == t1 + s2 - t2 ? 1 : 0;
120+
ans += i % 2 == 1 && t2 + s1 - t1 == t1 + s2 - t2 - v ? 1 : 0;
121+
t1 += i % 2 == 0 ? v : 0;
122+
t2 += i % 2 == 1 ? v : 0;
139123
}
140124
return ans;
141125
}
@@ -148,24 +132,20 @@ class Solution {
148132
class Solution {
149133
public:
150134
int waysToMakeFair(vector<int>& nums) {
135+
int s1 = 0, s2 = 0;
151136
int n = nums.size();
152-
int x = 0, y = 0;
153137
for (int i = 0; i < n; ++i) {
154-
if (i & 1)
155-
x += nums[i];
156-
else
157-
y += nums[i];
138+
s1 += i % 2 == 0 ? nums[i] : 0;
139+
s2 += i % 2 == 1 ? nums[i] : 0;
158140
}
141+
int t1 = 0, t2 = 0;
159142
int ans = 0;
160-
int a = 0, b = 0;
161143
for (int i = 0; i < n; ++i) {
162144
int v = nums[i];
163-
if (i % 2 == 1 && x - v - a + b == y - b + a) ++ans;
164-
if (i % 2 == 0 && y - v - b + a == x - a + b) ++ans;
165-
if (i % 2 == 1)
166-
a += v;
167-
else
168-
b += v;
145+
ans += i % 2 == 0 && t2 + s1 - t1 - v == t1 + s2 - t2;
146+
ans += i % 2 == 1 && t2 + s1 - t1 == t1 + s2 - t2 - v;
147+
t1 += i % 2 == 0 ? v : 0;
148+
t2 += i % 2 == 1 ? v : 0;
169149
}
170150
return ans;
171151
}
@@ -176,32 +156,60 @@ public:
176156
177157
```go
178158
func waysToMakeFair(nums []int) (ans int) {
179-
x, y := 0, 0
159+
var s1, s2, t1, t2 int
180160
for i, v := range nums {
181-
if i%2 == 1 {
182-
x += v
161+
if i%2 == 0 {
162+
s1 += v
183163
} else {
184-
y += v
164+
s2 += v
185165
}
186166
}
187-
a, b := 0, 0
188167
for i, v := range nums {
189-
if i%2 == 1 && x-v-a+b == y-b+a {
168+
if i%2 == 0 && t2+s1-t1-v == t1+s2-t2 {
190169
ans++
191170
}
192-
if i%2 == 0 && y-v-b+a == x-a+b {
171+
if i%2 == 1 && t2+s1-t1 == t1+s2-t2-v {
193172
ans++
194173
}
195-
if i%2 == 1 {
196-
a += v
174+
if i%2 == 0 {
175+
t1 += v
197176
} else {
198-
b += v
177+
t2 += v
199178
}
200179
}
201180
return
202181
}
203182
```
204183

184+
### **JavaScript**
185+
186+
```js
187+
/**
188+
* @param {number[]} nums
189+
* @return {number}
190+
*/
191+
var waysToMakeFair = function (nums) {
192+
let [s1, s2, t1, t2] = [0, 0, 0, 0];
193+
const n = nums.length;
194+
for (let i = 0; i < n; ++i) {
195+
if (i % 2 == 0) {
196+
s1 += nums[i];
197+
} else {
198+
s2 += nums[i];
199+
}
200+
}
201+
let ans = 0;
202+
for (let i = 0; i < n; ++i) {
203+
const v = nums[i];
204+
ans += i % 2 == 0 && t2 + s1 - t1 - v == t1 + s2 - t2;
205+
ans += i % 2 == 1 && t2 + s1 - t1 == t1 + s2 - t2 - v;
206+
t1 += i % 2 == 0 ? v : 0;
207+
t2 += i % 2 == 1 ? v : 0;
208+
}
209+
return ans;
210+
};
211+
```
212+
205213
### **...**
206214

207215
```

solution/1600-1699/1664.Ways to Make a Fair Array/README_EN.md

Lines changed: 60 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,13 @@ There is 1 index that you can remove to make nums fair.
6565
```python
6666
class Solution:
6767
def waysToMakeFair(self, nums: List[int]) -> int:
68-
x, y = sum(nums[1::2]), sum(nums[::2])
69-
ans = 0
70-
a = b = 0
68+
s1, s2 = sum(nums[::2]), sum(nums[1::2])
69+
ans = t1 = t2 = 0
7170
for i, v in enumerate(nums):
72-
if (i & 1) and x - v - a + b == y - b + a:
73-
ans += 1
74-
elif (i & 1) == 0 and y - v - b + a == x - a + b:
75-
ans += 1
76-
if i & 1:
77-
a += v
78-
else:
79-
b += v
71+
ans += i % 2 == 0 and t2 + s1 - t1 - v == t1 + s2 - t2
72+
ans += i % 2 == 1 and t2 + s1 - t1 == t1 + s2 - t2 - v
73+
t1 += v if i % 2 == 0 else 0
74+
t2 += v if i % 2 == 1 else 0
8075
return ans
8176
```
8277

@@ -85,29 +80,20 @@ class Solution:
8580
```java
8681
class Solution {
8782
public int waysToMakeFair(int[] nums) {
83+
int s1 = 0, s2 = 0;
8884
int n = nums.length;
89-
int x = 0, y = 0;
9085
for (int i = 0; i < n; ++i) {
91-
if (i % 2 == 1) {
92-
x += nums[i];
93-
} else {
94-
y += nums[i];
95-
}
86+
s1 += i % 2 == 0 ? nums[i] : 0;
87+
s2 += i % 2 == 1 ? nums[i] : 0;
9688
}
89+
int t1 = 0, t2 = 0;
9790
int ans = 0;
98-
int a = 0, b = 0;
9991
for (int i = 0; i < n; ++i) {
10092
int v = nums[i];
101-
if (i % 2 == 1 && x - v - a + b == y - b + a) {
102-
++ans;
103-
} else if (i % 2 == 0 && y - v - b + a == x - a + b) {
104-
++ans;
105-
}
106-
if (i % 2 == 1) {
107-
a += v;
108-
} else {
109-
b += v;
110-
}
93+
ans += i % 2 == 0 && t2 + s1 - t1 - v == t1 + s2 - t2 ? 1 : 0;
94+
ans += i % 2 == 1 && t2 + s1 - t1 == t1 + s2 - t2 - v ? 1 : 0;
95+
t1 += i % 2 == 0 ? v : 0;
96+
t2 += i % 2 == 1 ? v : 0;
11197
}
11298
return ans;
11399
}
@@ -120,24 +106,20 @@ class Solution {
120106
class Solution {
121107
public:
122108
int waysToMakeFair(vector<int>& nums) {
109+
int s1 = 0, s2 = 0;
123110
int n = nums.size();
124-
int x = 0, y = 0;
125111
for (int i = 0; i < n; ++i) {
126-
if (i & 1)
127-
x += nums[i];
128-
else
129-
y += nums[i];
112+
s1 += i % 2 == 0 ? nums[i] : 0;
113+
s2 += i % 2 == 1 ? nums[i] : 0;
130114
}
115+
int t1 = 0, t2 = 0;
131116
int ans = 0;
132-
int a = 0, b = 0;
133117
for (int i = 0; i < n; ++i) {
134118
int v = nums[i];
135-
if (i % 2 == 1 && x - v - a + b == y - b + a) ++ans;
136-
if (i % 2 == 0 && y - v - b + a == x - a + b) ++ans;
137-
if (i % 2 == 1)
138-
a += v;
139-
else
140-
b += v;
119+
ans += i % 2 == 0 && t2 + s1 - t1 - v == t1 + s2 - t2;
120+
ans += i % 2 == 1 && t2 + s1 - t1 == t1 + s2 - t2 - v;
121+
t1 += i % 2 == 0 ? v : 0;
122+
t2 += i % 2 == 1 ? v : 0;
141123
}
142124
return ans;
143125
}
@@ -148,32 +130,60 @@ public:
148130
149131
```go
150132
func waysToMakeFair(nums []int) (ans int) {
151-
x, y := 0, 0
133+
var s1, s2, t1, t2 int
152134
for i, v := range nums {
153-
if i%2 == 1 {
154-
x += v
135+
if i%2 == 0 {
136+
s1 += v
155137
} else {
156-
y += v
138+
s2 += v
157139
}
158140
}
159-
a, b := 0, 0
160141
for i, v := range nums {
161-
if i%2 == 1 && x-v-a+b == y-b+a {
142+
if i%2 == 0 && t2+s1-t1-v == t1+s2-t2 {
162143
ans++
163144
}
164-
if i%2 == 0 && y-v-b+a == x-a+b {
145+
if i%2 == 1 && t2+s1-t1 == t1+s2-t2-v {
165146
ans++
166147
}
167-
if i%2 == 1 {
168-
a += v
148+
if i%2 == 0 {
149+
t1 += v
169150
} else {
170-
b += v
151+
t2 += v
171152
}
172153
}
173154
return
174155
}
175156
```
176157

158+
### **JavaScript**
159+
160+
```js
161+
/**
162+
* @param {number[]} nums
163+
* @return {number}
164+
*/
165+
var waysToMakeFair = function (nums) {
166+
let [s1, s2, t1, t2] = [0, 0, 0, 0];
167+
const n = nums.length;
168+
for (let i = 0; i < n; ++i) {
169+
if (i % 2 == 0) {
170+
s1 += nums[i];
171+
} else {
172+
s2 += nums[i];
173+
}
174+
}
175+
let ans = 0;
176+
for (let i = 0; i < n; ++i) {
177+
const v = nums[i];
178+
ans += i % 2 == 0 && t2 + s1 - t1 - v == t1 + s2 - t2;
179+
ans += i % 2 == 1 && t2 + s1 - t1 == t1 + s2 - t2 - v;
180+
t1 += i % 2 == 0 ? v : 0;
181+
t2 += i % 2 == 1 ? v : 0;
182+
}
183+
return ans;
184+
};
185+
```
186+
177187
### **...**
178188

179189
```

solution/1600-1699/1664.Ways to Make a Fair Array/Solution.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
class Solution {
22
public:
33
int waysToMakeFair(vector<int>& nums) {
4+
int s1 = 0, s2 = 0;
45
int n = nums.size();
5-
int x = 0, y = 0;
66
for (int i = 0; i < n; ++i) {
7-
if (i & 1)
8-
x += nums[i];
9-
else
10-
y += nums[i];
7+
s1 += i % 2 == 0 ? nums[i] : 0;
8+
s2 += i % 2 == 1 ? nums[i] : 0;
119
}
10+
int t1 = 0, t2 = 0;
1211
int ans = 0;
13-
int a = 0, b = 0;
1412
for (int i = 0; i < n; ++i) {
1513
int v = nums[i];
16-
if (i % 2 == 1 && x - v - a + b == y - b + a) ++ans;
17-
if (i % 2 == 0 && y - v - b + a == x - a + b) ++ans;
18-
if (i % 2 == 1)
19-
a += v;
20-
else
21-
b += v;
14+
ans += i % 2 == 0 && t2 + s1 - t1 - v == t1 + s2 - t2;
15+
ans += i % 2 == 1 && t2 + s1 - t1 == t1 + s2 - t2 - v;
16+
t1 += i % 2 == 0 ? v : 0;
17+
t2 += i % 2 == 1 ? v : 0;
2218
}
2319
return ans;
2420
}

0 commit comments

Comments
 (0)