执行结果:通过
题目:3239 最少翻转次数使二进制矩阵回文I
给你一个 m x n
的二进制矩阵 grid
。
如果矩阵中一行或者一列从前往后与从后往前读是一样的,那么我们称这一行或者这一列是 回文 的。
你可以将 grid
中任意格子的值 翻转 ,也就是将格子里的值从 0
变成 1
,或者从 1
变成 0
。
请你返回 最少 翻转次数,使得矩阵 要么 所有行是 回文的 ,要么所有列是 回文的 。
示例 1:
输入:grid = [[1,0,0],[0,0,0],[0,0,1]]
输出:2
解释:
将高亮的格子翻转,得到所有行都是回文的。
示例 2:
输入:grid = [[0,1],[0,1],[0,0]]
输出:1
解释:
将高亮的格子翻转,得到所有列都是回文的。
示例 3:
输入:grid = [[1],[0]]
输出:0
解释:
所有行已经是回文的。
提示:
m == grid.length
n == grid[i].length
1 <= m * n <= 2 * 105
0 <= grid[i][j] <= 1
代码与解题思路
代码:
#define MIN(a, b) ((b) < (a) ? (b) : (a))
int minFlips(int** grid, int gridSize, int* gridColSize) {int m = gridSize, n = gridColSize[0];int diff_row = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n / 2; j++) {if (grid[i][j] != grid[i][n - 1 - j]) {diff_row++;}}}int diff_col = 0;for (int j = 0; j < n; j++) {for (int i = 0; i < m / 2; i++) {if (grid[i][j] != grid[m - 1 - i][j]) {diff_col++;}}}return MIN(diff_row, diff_col);}
解题思路:
- 理解问题:
- 给定一个
m x n
的网格grid
,每个元素是0
或1
。 - 需要计算将网格变为镜像对称所需的最小翻转次数。
- 给定一个
- 镜像对称的定义:
- 水平镜像对称:每一行的前半部分和后半部分对称。
- 垂直镜像对称:每一列的上半部分和下半部分对称。
- 计算水平镜像对称的差异:
- 遍历每一行,比较该行中每对对称位置的元素(即
grid[i][j]
和grid[i][n - 1 - j]
)。 - 如果这对元素不相等,则记录一个差异(
diff_row
)。
- 遍历每一行,比较该行中每对对称位置的元素(即
- 计算垂直镜像对称的差异:
- 遍历每一列,比较该列中每对对称位置的元素(即
grid[i][j]
和grid[m - 1 - i][j]
)。 - 如果这对元素不相等,则记录一个差异(
diff_col
)。
- 遍历每一列,比较该列中每对对称位置的元素(即
- 返回最小差异:
- 使用宏
MIN
来比较diff_row
和diff_col
,返回两者中的较小值,即为将网格变为镜像对称所需的最小翻转次数。
- 使用宏