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 02e7ff7

Browse files
feat: add solutions to lc problem: No.3240 (#3732)
No.3240.Minimum Number of Flips to Make Binary Grid Palindromic II
1 parent ca1ddbe commit 02e7ff7

File tree

7 files changed

+627
-8
lines changed

7 files changed

+627
-8
lines changed

‎solution/3200-3299/3240.Minimum Number of Flips to Make Binary Grid Palindromic II/README.md‎

Lines changed: 217 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,32 +83,245 @@ tags:
8383

8484
<!-- solution:start -->
8585

86-
### 方法一
86+
### 方法一:分类讨论
87+
88+
行和列都是回文的,那么对于任意 $i \in [0, m / 2)$ 和 $j \in [0, n / 2),ドル都需要满足 $\text{grid}[i][j] = \text{grid}[m - i - 1][j] = \text{grid}[i][n - j - 1] = \text{grid}[m - i - 1][n - j - 1],ドル要么都变成 0ドル,ドル要么都变成 1ドル,ドル变成 0ドル$ 的次数为 $c_0 = \text{grid}[i][j] + \text{grid}[m - i - 1][j] + \text{grid}[i][n - j - 1] + \text{grid}[m - i - 1][n - j - 1],ドル变成 1ドル$ 的次数为 $c_1 = 4 - c_0,ドル取两者的较小值,累加到答案中。
89+
90+
接下来,我们再讨论 $m$ 和 $n$ 的奇偶性:
91+
92+
- 如果 $m$ 和 $n$ 都是偶数,那么直接返回答案;
93+
- 如果 $m$ 和 $n$ 都是奇数,那么最中间的格子只能是 0ドル,ドル因为题目要求 1ドル$ 的数目可以被 4ドル$ 整除;
94+
- 如果 $m$ 是奇数,而 $n$ 是偶数,那么我们需要考虑最中间的一行;
95+
- 如果 $m$ 是偶数,而 $n$ 是奇数,那么我们需要考虑最中间的一列。
96+
97+
对于后两种情况,我们需要统计最中间的一行或一列中对应位置不相同的格子对数 $\text{diff},ドル以及对应位置相同且为 1ドル$ 的格子个数 $\text{cnt1},ドル然后再分情况讨论:
98+
99+
- 如果 $\text{cnt1} \bmod 4 = 0,ドル那么我们只需要将 $\text{diff}$ 个格子变成 0ドル$ 即可,操作次数为 $\text{diff}$;
100+
- 否则,说明 $\text{cnt1} = 2,ドル此时如果 $\text{diff} \lt 0,ドル我们可以将其中一个格子变成 1ドル,ドル使得 $\text{cnt1} = 4,ドル那么剩下的 $\text{diff} - 1$ 个格子变成 0ドル$ 即可,操作次数一共为 $\text{diff}$。
101+
- 否则,如果 $\text{diff} = 0,ドル我们就把 $\text{2}$ 个格子变成 0ドル,ドル使得 $\text{cnt1} \bmod 4 = 0,ドル操作次数为 $\text{2}$。
102+
103+
我们将操作次数累加到答案中,最后返回答案即可。
104+
105+
时间复杂度 $O(m \times n),ドル其中 $m$ 和 $n$ 分别是矩阵的行数和列数。空间复杂度 $O(1)$。
87106

88107
<!-- tabs:start -->
89108

90109
#### Python3
91110

92111
```python
93-
112+
class Solution:
113+
def minFlips(self, grid: List[List[int]]) -> int:
114+
m, n = len(grid), len(grid[0])
115+
ans = 0
116+
for i in range(m // 2):
117+
for j in range(n // 2):
118+
x, y = m - i - 1, n - j - 1
119+
cnt1 = grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y]
120+
ans += min(cnt1, 4 - cnt1)
121+
if m % 2 and n % 2:
122+
ans += grid[m // 2][n // 2]
123+
diff = cnt1 = 0
124+
if m % 2:
125+
for j in range(n // 2):
126+
if grid[m // 2][j] == grid[m // 2][n - j - 1]:
127+
cnt1 += grid[m // 2][j] * 2
128+
else:
129+
diff += 1
130+
if n % 2:
131+
for i in range(m // 2):
132+
if grid[i][n // 2] == grid[m - i - 1][n // 2]:
133+
cnt1 += grid[i][n // 2] * 2
134+
else:
135+
diff += 1
136+
ans += diff if cnt1 % 4 == 0 or diff else 2
137+
return ans
94138
```
95139

96140
#### Java
97141

98142
```java
99-
143+
class Solution {
144+
public int minFlips(int[][] grid) {
145+
int m = grid.length, n = grid[0].length;
146+
int ans = 0;
147+
for (int i = 0; i < m / 2; ++i) {
148+
for (int j = 0; j < n / 2; ++j) {
149+
int x = m - i - 1, y = n - j - 1;
150+
int cnt1 = grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y];
151+
ans += Math.min(cnt1, 4 - cnt1);
152+
}
153+
}
154+
if (m % 2 == 1 && n % 2 == 1) {
155+
ans += grid[m / 2][n / 2];
156+
}
157+
158+
int diff = 0, cnt1 = 0;
159+
if (m % 2 == 1) {
160+
for (int j = 0; j < n / 2; ++j) {
161+
if (grid[m / 2][j] == grid[m / 2][n - j - 1]) {
162+
cnt1 += grid[m / 2][j] * 2;
163+
} else {
164+
diff += 1;
165+
}
166+
}
167+
}
168+
if (n % 2 == 1) {
169+
for (int i = 0; i < m / 2; ++i) {
170+
if (grid[i][n / 2] == grid[m - i - 1][n / 2]) {
171+
cnt1 += grid[i][n / 2] * 2;
172+
} else {
173+
diff += 1;
174+
}
175+
}
176+
}
177+
ans += cnt1 % 4 == 0 || diff > 0 ? diff : 2;
178+
return ans;
179+
}
180+
}
100181
```
101182

102183
#### C++
103184

104185
```cpp
105-
186+
class Solution {
187+
public:
188+
int minFlips(vector<vector<int>>& grid) {
189+
int m = grid.size(), n = grid[0].size();
190+
int ans = 0;
191+
for (int i = 0; i < m / 2; ++i) {
192+
for (int j = 0; j < n / 2; ++j) {
193+
int x = m - i - 1, y = n - j - 1;
194+
int cnt1 = grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y];
195+
ans += min(cnt1, 4 - cnt1);
196+
}
197+
}
198+
if (m % 2 == 1 && n % 2 == 1) {
199+
ans += grid[m / 2][n / 2];
200+
}
201+
202+
int diff = 0, cnt1 = 0;
203+
if (m % 2 == 1) {
204+
for (int j = 0; j < n / 2; ++j) {
205+
if (grid[m / 2][j] == grid[m / 2][n - j - 1]) {
206+
cnt1 += grid[m / 2][j] * 2;
207+
} else {
208+
diff += 1;
209+
}
210+
}
211+
}
212+
if (n % 2 == 1) {
213+
for (int i = 0; i < m / 2; ++i) {
214+
if (grid[i][n / 2] == grid[m - i - 1][n / 2]) {
215+
cnt1 += grid[i][n / 2] * 2;
216+
} else {
217+
diff += 1;
218+
}
219+
}
220+
}
221+
ans += cnt1 % 4 == 0 || diff > 0 ? diff : 2;
222+
return ans;
223+
}
224+
};
106225
```
107226

108227
#### Go
109228

110229
```go
230+
func minFlips(grid [][]int) int {
231+
m, n := len(grid), len(grid[0])
232+
ans := 0
233+
234+
for i := 0; i < m/2; i++ {
235+
for j := 0; j < n/2; j++ {
236+
x, y := m-i-1, n-j-1
237+
cnt1 := grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y]
238+
ans += min(cnt1, 4-cnt1)
239+
}
240+
}
241+
242+
if m%2 == 1 && n%2 == 1 {
243+
ans += grid[m/2][n/2]
244+
}
245+
246+
diff, cnt1 := 0, 0
247+
248+
if m%2 == 1 {
249+
for j := 0; j < n/2; j++ {
250+
if grid[m/2][j] == grid[m/2][n-j-1] {
251+
cnt1 += grid[m/2][j] * 2
252+
} else {
253+
diff += 1
254+
}
255+
}
256+
}
257+
258+
if n%2 == 1 {
259+
for i := 0; i < m/2; i++ {
260+
if grid[i][n/2] == grid[m-i-1][n/2] {
261+
cnt1 += grid[i][n/2] * 2
262+
} else {
263+
diff += 1
264+
}
265+
}
266+
}
267+
268+
if cnt1%4 == 0 || diff > 0 {
269+
ans += diff
270+
} else {
271+
ans += 2
272+
}
273+
274+
return ans
275+
}
276+
```
111277

278+
#### TypeScript
279+
280+
```ts
281+
function minFlips(grid: number[][]): number {
282+
const m = grid.length;
283+
const n = grid[0].length;
284+
let ans = 0;
285+
286+
for (let i = 0; i < Math.floor(m / 2); i++) {
287+
for (let j = 0; j < Math.floor(n / 2); j++) {
288+
const x = m - i - 1;
289+
const y = n - j - 1;
290+
const cnt1 = grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y];
291+
ans += Math.min(cnt1, 4 - cnt1);
292+
}
293+
}
294+
295+
if (m % 2 === 1 && n % 2 === 1) {
296+
ans += grid[Math.floor(m / 2)][Math.floor(n / 2)];
297+
}
298+
299+
let diff = 0,
300+
cnt1 = 0;
301+
302+
if (m % 2 === 1) {
303+
for (let j = 0; j < Math.floor(n / 2); j++) {
304+
if (grid[Math.floor(m / 2)][j] === grid[Math.floor(m / 2)][n - j - 1]) {
305+
cnt1 += grid[Math.floor(m / 2)][j] * 2;
306+
} else {
307+
diff += 1;
308+
}
309+
}
310+
}
311+
312+
if (n % 2 === 1) {
313+
for (let i = 0; i < Math.floor(m / 2); i++) {
314+
if (grid[i][Math.floor(n / 2)] === grid[m - i - 1][Math.floor(n / 2)]) {
315+
cnt1 += grid[i][Math.floor(n / 2)] * 2;
316+
} else {
317+
diff += 1;
318+
}
319+
}
320+
}
321+
322+
ans += cnt1 % 4 === 0 || diff > 0 ? diff : 2;
323+
return ans;
324+
}
112325
```
113326

114327
<!-- tabs:end -->

0 commit comments

Comments
(0)

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