原题链接

模拟法做本题非常直观,这里给出一种只需一次遍历就能完成的方法。

在双指针的过程中,如果 i 和 j 指向的元素相同,那么翻转后也相同,只需要进行取反操作。如果 i 和 j 指向的元素不同,那么翻转再取反后就和当前状态一样,所以不用动。如果矩阵列数为奇数,中央元素需要取反一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
int n = A.size();
for(int i=0;i<n;i++) {
int j=0, k = n-1;
while(j<k) {
if(A[i][j] == A[i][k]) {
A[i][j] ^= 1;
A[i][k] ^= 1;
}
j++, k--;
}
if(j == k) A[i][j] ^= 1;
}

return A;
}
};