class Solution {
public:
int minFlips(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
auto flip = [&](int rows, int cols, bool horizontal) -> int {
int cnt = 0;
for (int i = 0; i < rows; ++i) {
int l = 0, r = cols - 1;
while (l < r) {
if ((horizontal && grid[i][l++] != grid[i][r--]) ||
(!horizontal && grid[l++][i] != grid[r--][i])) {
++cnt;
}
}
}
return cnt;
};
return min(flip(m, n, true), flip(n, m, false));
}
};
详解
获取网格的维度
bash复制代码
int m = grid.size(), n = grid[0].size();
m 表示网格的行数。
n 表示网格的列数。
定义翻转操作的 lambda 函数
bash复制代码
auto flip = [&](int rows, int cols, bool horizontal) -> int {
int cnt = 0;
for (int i = 0; i < rows; ++i) {
int l = 0, r = cols - 1;
while (l < r) {
if ((horizontal && grid[i][l++] != grid[i][r--]) ||
(!horizontal && grid[l++][i] != grid[r--][i])) {
++cnt;
}
}
}
return cnt;
};
flip 是一个 lambda 函数,用于计算需要多少次翻转才能使指定方向上的对称元素相等。
rows 和 cols 分别表示要检查的行数和列数。
horizontal 是一个布尔变量,指示是否进行水平翻转。
cnt 用于计数需要翻转的次数。
外层循环遍历每一行(或每一列,取决于 horizontal)。
内层循环使用两个指针 l 和 r 分别从两端向中间移动,比较对应位置的元素是否相等。如果不相等,则增加 cnt 计数器。
返回结果
bash复制代码
return min(flip(m, n, true), flip(n, m, false));
}
};