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
Solution
Python3
class Solution:
def minFlips(self, grid: List[List[int]]) -> int:
rows, cols = len(grid), len(grid[0])
flips = totalOnes = symmetricPairs = 0
for i in range((rows + 1) // 2):
for j in range((cols + 1) // 2):
A = {(i, j), (i, cols - 1 - j), (rows - 1 - i, j), (rows - 1 - i, cols - 1 - j)}
count = len(A)
ones = sum(grid[x][y] for x, y in A)
zeroes = count - ones
flips += min(ones, zeroes) # flip all ones -> zeroes or zeroes -> ones
if ones == zeroes and count == 2:
symmetricPairs += 1
if zeroes < ones: # means ideally will swap all zeroes to ones
totalOnes += count
if totalOnes % 4 == 2 and symmetricPairs > 0:
return flips
if totalOnes % 4 == 3 and symmetricPairs > 0:
return flips + 1
return flips + (totalOnes % 4)