Skip to content

Commit 469f340

Browse files
committed
feat: add solutions to lc problem: No.1664
No.1664.Ways to Make a Fair Array
1 parent efbce23 commit 469f340

File tree

6 files changed

+318
-2
lines changed

6 files changed

+318
-2
lines changed

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

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,22 +64,142 @@
6464

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

67+
**方法一:预处理 + 枚举**
68+
69+
我们先预处理得到数组 `nums` 的奇数下标元素之和 $x$ 以及偶数下标元素之和 $y$。
70+
71+
然后从前往后枚举数组 `nums` 的每个元素 $v$,用变量 $a$ 和 $b$ 分别记录已遍历的奇数下标元素之和以及偶数下标元素之和。
72+
73+
我们观察发现,对于当前遍历到的元素 $v$,如果删除了,那么该元素之后的奇偶下标元素之和会发生交换。此时,我们先判断该位置下标 $i$ 是奇数还是偶数。
74+
75+
如果是奇数下标,删除该元素后,数组的偶数下标元素之和为 $x-v-a+b$,而奇数下标元素之和为 $y-b+a$,如果这两个和相等,那么就是一个平衡数组,答案加一。
76+
77+
如果是偶数下标,删除该元素后,数组的奇数下标元素之和为 $y-v-b+a$,而偶数下标元素之和为 $x-a+b$,如果这两个和相等,那么就是一个平衡数组,答案加一。
78+
79+
然后我们更新 $a$ 和 $b$,继续遍历下一个元素。
80+
81+
遍历完数组后,即可得到答案。
82+
83+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
84+
6785
<!-- tabs:start -->
6886

6987
### **Python3**
7088

7189
<!-- 这里可写当前语言的特殊实现逻辑 -->
7290

7391
```python
74-
92+
class Solution:
93+
def waysToMakeFair(self, nums: List[int]) -> int:
94+
x, y = sum(nums[1::2]), sum(nums[::2])
95+
ans = 0
96+
a = b = 0
97+
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
106+
return ans
75107
```
76108

77109
### **Java**
78110

79111
<!-- 这里可写当前语言的特殊实现逻辑 -->
80112

81113
```java
114+
class Solution {
115+
public int waysToMakeFair(int[] nums) {
116+
int n = nums.length;
117+
int x = 0, y = 0;
118+
for (int i = 0; i < n; ++i) {
119+
if (i % 2 == 1) {
120+
x += nums[i];
121+
} else {
122+
y += nums[i];
123+
}
124+
}
125+
int ans = 0;
126+
int a = 0, b = 0;
127+
for (int i = 0; i < n; ++i) {
128+
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+
}
139+
}
140+
return ans;
141+
}
142+
}
143+
```
144+
145+
### **C++**
146+
147+
```cpp
148+
class Solution {
149+
public:
150+
int waysToMakeFair(vector<int>& nums) {
151+
int n = nums.size();
152+
int x = 0, y = 0;
153+
for (int i = 0; i < n; ++i) {
154+
if (i & 1)
155+
x += nums[i];
156+
else
157+
y += nums[i];
158+
}
159+
int ans = 0;
160+
int a = 0, b = 0;
161+
for (int i = 0; i < n; ++i) {
162+
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;
169+
}
170+
return ans;
171+
}
172+
};
173+
```
82174
175+
### **Go**
176+
177+
```go
178+
func waysToMakeFair(nums []int) (ans int) {
179+
x, y := 0, 0
180+
for i, v := range nums {
181+
if i%2 == 1 {
182+
x += v
183+
} else {
184+
y += v
185+
}
186+
}
187+
a, b := 0, 0
188+
for i, v := range nums {
189+
if i%2 == 1 && x-v-a+b == y-b+a {
190+
ans++
191+
}
192+
if i%2 == 0 && y-v-b+a == x-a+b {
193+
ans++
194+
}
195+
if i%2 == 1 {
196+
a += v
197+
} else {
198+
b += v
199+
}
200+
}
201+
return
202+
}
83203
```
84204

85205
### **...**

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

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,115 @@ There is 1 index that you can remove to make nums fair.
6363
### **Python3**
6464

6565
```python
66-
66+
class Solution:
67+
def waysToMakeFair(self, nums: List[int]) -> int:
68+
x, y = sum(nums[1::2]), sum(nums[::2])
69+
ans = 0
70+
a = b = 0
71+
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
80+
return ans
6781
```
6882

6983
### **Java**
7084

7185
```java
86+
class Solution {
87+
public int waysToMakeFair(int[] nums) {
88+
int n = nums.length;
89+
int x = 0, y = 0;
90+
for (int i = 0; i < n; ++i) {
91+
if (i % 2 == 1) {
92+
x += nums[i];
93+
} else {
94+
y += nums[i];
95+
}
96+
}
97+
int ans = 0;
98+
int a = 0, b = 0;
99+
for (int i = 0; i < n; ++i) {
100+
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+
}
111+
}
112+
return ans;
113+
}
114+
}
115+
```
116+
117+
### **C++**
118+
119+
```cpp
120+
class Solution {
121+
public:
122+
int waysToMakeFair(vector<int>& nums) {
123+
int n = nums.size();
124+
int x = 0, y = 0;
125+
for (int i = 0; i < n; ++i) {
126+
if (i & 1)
127+
x += nums[i];
128+
else
129+
y += nums[i];
130+
}
131+
int ans = 0;
132+
int a = 0, b = 0;
133+
for (int i = 0; i < n; ++i) {
134+
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;
141+
}
142+
return ans;
143+
}
144+
};
145+
```
72146
147+
### **Go**
148+
149+
```go
150+
func waysToMakeFair(nums []int) (ans int) {
151+
x, y := 0, 0
152+
for i, v := range nums {
153+
if i%2 == 1 {
154+
x += v
155+
} else {
156+
y += v
157+
}
158+
}
159+
a, b := 0, 0
160+
for i, v := range nums {
161+
if i%2 == 1 && x-v-a+b == y-b+a {
162+
ans++
163+
}
164+
if i%2 == 0 && y-v-b+a == x-a+b {
165+
ans++
166+
}
167+
if i%2 == 1 {
168+
a += v
169+
} else {
170+
b += v
171+
}
172+
}
173+
return
174+
}
73175
```
74176

75177
### **...**
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
int waysToMakeFair(vector<int>& nums) {
4+
int n = nums.size();
5+
int x = 0, y = 0;
6+
for (int i = 0; i < n; ++i) {
7+
if (i & 1)
8+
x += nums[i];
9+
else
10+
y += nums[i];
11+
}
12+
int ans = 0;
13+
int a = 0, b = 0;
14+
for (int i = 0; i < n; ++i) {
15+
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;
22+
}
23+
return ans;
24+
}
25+
};
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
func waysToMakeFair(nums []int) (ans int) {
2+
x, y := 0, 0
3+
for i, v := range nums {
4+
if i%2 == 1 {
5+
x += v
6+
} else {
7+
y += v
8+
}
9+
}
10+
a, b := 0, 0
11+
for i, v := range nums {
12+
if i%2 == 1 && x-v-a+b == y-b+a {
13+
ans++
14+
}
15+
if i%2 == 0 && y-v-b+a == x-a+b {
16+
ans++
17+
}
18+
if i%2 == 1 {
19+
a += v
20+
} else {
21+
b += v
22+
}
23+
}
24+
return
25+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution {
2+
public int waysToMakeFair(int[] nums) {
3+
int n = nums.length;
4+
int x = 0, y = 0;
5+
for (int i = 0; i < n; ++i) {
6+
if (i % 2 == 1) {
7+
x += nums[i];
8+
} else {
9+
y += nums[i];
10+
}
11+
}
12+
int ans = 0;
13+
int a = 0, b = 0;
14+
for (int i = 0; i < n; ++i) {
15+
int v = nums[i];
16+
if (i % 2 == 1 && x - v - a + b == y - b + a) {
17+
++ans;
18+
} else if (i % 2 == 0 && y - v - b + a == x - a + b) {
19+
++ans;
20+
}
21+
if (i % 2 == 1) {
22+
a += v;
23+
} else {
24+
b += v;
25+
}
26+
}
27+
return ans;
28+
}
29+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def waysToMakeFair(self, nums: List[int]) -> int:
3+
x, y = sum(nums[1::2]), sum(nums[::2])
4+
ans = 0
5+
a = b = 0
6+
for i, v in enumerate(nums):
7+
if (i & 1) and x - v - a + b == y - b + a:
8+
ans += 1
9+
elif (i & 1) == 0 and y - v - b + a == x - a + b:
10+
ans += 1
11+
if i & 1:
12+
a += v
13+
else:
14+
b += v
15+
return ans

0 commit comments

Comments
 (0)