Welcome to Subscribe On Youtube
3240. Minimum Number of Flips to Make Binary Grid Palindromic II
Description
You are given an m x n
binary matrix grid
.
A row or column is considered palindromic if its values read the same forward and backward.
You can flip any number of cells in grid
from 0
to 1
, or from 1
to 0
.
Return the minimum number of cells that need to be flipped to make all rows and columns palindromic, and the total number of 1
's in grid
divisible by 4
.
Example 1:
Input: grid = [[1,0,0],[0,1,0],[0,0,1]]
Output: 3
Explanation:
Example 2:
Input: grid = [[0,1],[0,1],[0,0]]
Output: 2
Explanation:
Example 3:
Input: grid = [[1],[1]]
Output: 2
Explanation:
Constraints:
m == grid.length
n == grid[i].length
1 <= m * n <= 2 * 105
0 <= grid[i][j] <= 1
Solutions
Solution 1
-
class Solution { public int minFlips(int[][] grid) { int m = grid.length, n = grid[0].length; int ans = 0; for (int i = 0; i < m / 2; ++i) { for (int j = 0; j < n / 2; ++j) { int x = m - i - 1, y = n - j - 1; int cnt1 = grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y]; ans += Math.min(cnt1, 4 - cnt1); } } if (m % 2 == 1 && n % 2 == 1) { ans += grid[m / 2][n / 2]; } int diff = 0, cnt1 = 0; if (m % 2 == 1) { for (int j = 0; j < n / 2; ++j) { if (grid[m / 2][j] == grid[m / 2][n - j - 1]) { cnt1 += grid[m / 2][j] * 2; } else { diff += 1; } } } if (n % 2 == 1) { for (int i = 0; i < m / 2; ++i) { if (grid[i][n / 2] == grid[m - i - 1][n / 2]) { cnt1 += grid[i][n / 2] * 2; } else { diff += 1; } } } ans += cnt1 % 4 == 0 || diff > 0 ? diff : 2; return ans; } }
-
class Solution { public: int minFlips(vector<vector<int>>& grid) { int m = grid.size(), n = grid[0].size(); int ans = 0; for (int i = 0; i < m / 2; ++i) { for (int j = 0; j < n / 2; ++j) { int x = m - i - 1, y = n - j - 1; int cnt1 = grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y]; ans += min(cnt1, 4 - cnt1); } } if (m % 2 == 1 && n % 2 == 1) { ans += grid[m / 2][n / 2]; } int diff = 0, cnt1 = 0; if (m % 2 == 1) { for (int j = 0; j < n / 2; ++j) { if (grid[m / 2][j] == grid[m / 2][n - j - 1]) { cnt1 += grid[m / 2][j] * 2; } else { diff += 1; } } } if (n % 2 == 1) { for (int i = 0; i < m / 2; ++i) { if (grid[i][n / 2] == grid[m - i - 1][n / 2]) { cnt1 += grid[i][n / 2] * 2; } else { diff += 1; } } } ans += cnt1 % 4 == 0 || diff > 0 ? diff : 2; return ans; } };
-
class Solution: def minFlips(self, grid: List[List[int]]) -> int: m, n = len(grid), len(grid[0]) ans = 0 for i in range(m // 2): for j in range(n // 2): x, y = m - i - 1, n - j - 1 cnt1 = grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y] ans += min(cnt1, 4 - cnt1) if m % 2 and n % 2: ans += grid[m // 2][n // 2] diff = cnt1 = 0 if m % 2: for j in range(n // 2): if grid[m // 2][j] == grid[m // 2][n - j - 1]: cnt1 += grid[m // 2][j] * 2 else: diff += 1 if n % 2: for i in range(m // 2): if grid[i][n // 2] == grid[m - i - 1][n // 2]: cnt1 += grid[i][n // 2] * 2 else: diff += 1 ans += diff if cnt1 % 4 == 0 or diff else 2 return ans
-
func minFlips(grid [][]int) int { m, n := len(grid), len(grid[0]) ans := 0 for i := 0; i < m/2; i++ { for j := 0; j < n/2; j++ { x, y := m-i-1, n-j-1 cnt1 := grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y] ans += min(cnt1, 4-cnt1) } } if m%2 == 1 && n%2 == 1 { ans += grid[m/2][n/2] } diff, cnt1 := 0, 0 if m%2 == 1 { for j := 0; j < n/2; j++ { if grid[m/2][j] == grid[m/2][n-j-1] { cnt1 += grid[m/2][j] * 2 } else { diff += 1 } } } if n%2 == 1 { for i := 0; i < m/2; i++ { if grid[i][n/2] == grid[m-i-1][n/2] { cnt1 += grid[i][n/2] * 2 } else { diff += 1 } } } if cnt1%4 == 0 || diff > 0 { ans += diff } else { ans += 2 } return ans }
-
function minFlips(grid: number[][]): number { const m = grid.length; const n = grid[0].length; let ans = 0; for (let i = 0; i < Math.floor(m / 2); i++) { for (let j = 0; j < Math.floor(n / 2); j++) { const x = m - i - 1; const y = n - j - 1; const cnt1 = grid[i][j] + grid[x][j] + grid[i][y] + grid[x][y]; ans += Math.min(cnt1, 4 - cnt1); } } if (m % 2 === 1 && n % 2 === 1) { ans += grid[Math.floor(m / 2)][Math.floor(n / 2)]; } let diff = 0, cnt1 = 0; if (m % 2 === 1) { for (let j = 0; j < Math.floor(n / 2); j++) { if (grid[Math.floor(m / 2)][j] === grid[Math.floor(m / 2)][n - j - 1]) { cnt1 += grid[Math.floor(m / 2)][j] * 2; } else { diff += 1; } } } if (n % 2 === 1) { for (let i = 0; i < Math.floor(m / 2); i++) { if (grid[i][Math.floor(n / 2)] === grid[m - i - 1][Math.floor(n / 2)]) { cnt1 += grid[i][Math.floor(n / 2)] * 2; } else { diff += 1; } } } ans += cnt1 % 4 === 0 || diff > 0 ? diff : 2; return ans; }