题目描述
给定一个01矩阵,对矩阵进行以下操作:
-
水平方向翻转图像,如: 行[1, 1, 0]水平翻转之后变为[0, 1, 1]
-
倒置图像的每个元素,即用0替代1,用1替代0。如:[0, 1, 1]变为[1, 0, 0]。
样例
输入:[[1,1,0],[1,0,1],[0,0,0]]
输出:[[1,0,0],[0,1,0],[1,1,1]]
解释:进行第一步操作之后,矩阵结果为:[[0,1,1],[1,0,1],[0,0,0]]
再第二部操作后得到最终结果:[[1,0,0],[0,1,0],[1,1,1]]
算法1
(暴力枚举) $O(mn)$
第一个操作水平方向上的翻转,将行上第i个元素和第(n - 1 - i)个元素交换,即可得到。第二个操作,将对于元素a与1进行异或,即可实现。
时间复杂度分析:遍历了一遍矩阵,复杂度为元素个数。在这里即为$O(mn)$, $m$为矩阵行数,$n$为矩阵列数。
空间复杂度:$O(1)$
C++ 代码
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
int n = A[0].size();
for (int i = 0; i < A.size(); i++)
for (int j = 0; j < (n + 1) / 2; j++) {
int tmp = A[i][j] ^ 1;
A[i][j] = A[i][n - 1 - j] ^ 1;
A[i][n - 1 - j] = tmp;
}
return A;
}