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 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)

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