3240. 最少翻转次数使二进制矩阵回文 II
题目链接:3240. 最少翻转次数使二进制矩阵回文 II
代码如下:
class Solution
{
public:
int minFlips(vector<vector<int>>& a)
{
int m = a.size(), n = a[0].size();
int res = 0;
for (int i = 0; i < m / 2; i++)
{
for (int j = 0; j < n / 2; j++)
{
int cnt1 = a[i][j] + a[i][n - 1 - j] + a[m - 1 - i][j] + a[m - 1 - i][n - 1 - j];
res += min(cnt1, 4 - cnt1); // 全为 1 或全为 0
}
}
if (m % 2 && n % 2)
{
// 正中间的数必须是 0
res += a[m / 2][n / 2];
}
int diff = 0, cnt1 = 0;
if (m % 2)
{
// 统计正中间这一排
for (int j = 0; j < n / 2; j++) {
if (a[m / 2][j] != a[m / 2][n - 1 - j])
{
diff++;
}
else
{
cnt1 += a[m / 2][j] * 2;
}
}
}
if (n % 2)
{
// 统计正中间这一列
for (int i = 0; i < m / 2; i++) {
if (a[i][n / 2] != a[m - 1 - i][n / 2])
{
diff++;
}
else
{
cnt1 += a[i][n / 2] * 2;
}
}
}
return res + (diff ? diff : cnt1 % 4);
}
};