执行结果:通过

题目: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.lengthn == grid[i].length1 <= m * n <= 2 * 1050 <= 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,返回两者中的较小值,即为将网格变为镜像对称所需的最小翻转次数。
- 使用宏
