## 描述
给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]。
示例 1:
```
输入:[[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]]
```
示例 2:
```
输入:[[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
输出:[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
解释:首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]];
然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
```
提示:
```
1 <= A.length = A[0].length <= 20
0 <= A[i][j] <= 1
```
## 思考
**切题**之后首先想到的就是如下方法:
* 循环遍历矩阵`二维数组` 逐一翻转
* 循环遍历矩阵反转
### Code 01
```java
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
int temp = -1, number = A.length;
if (number % 2 == 0) {
for (int i = 0; i < number; i++) {
for (int j = 0; j < number / 2; j++) {
temp = A[i][j];
A[i][j] = A[i][number-j-1] == 0 ? 1 : 0;
A[i][number-j-1] = temp == 0 ? 1 : 0;
}
}
} else {
for (int i = 0; i < number; i++) {
for (int j = 0; j <= number / 2; j++) {
temp = A[i][j];
A[i][j] = A[i][number-j-1] == 0 ? 1 : 0;
A[i][number-j-1] = temp == 0 ? 1 : 0;
}
}
}
return A;
}
}
```
**提交**之后发现方法有点笨,然后就去看评论与题解,基本上思路是正确的,只是在`code`时候不同语言有不同的优势,代码量上有差别而已。
其中关于反转有两个巧妙方法:
* 1 - X
* X^1
### Code 02
```java
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
int number = A.length;
int[][] B = new int[number][number];
for (int i = 0; i < number; i++) {
for (int j = 0; j < number; j++) {
B[i][number-j-1] = 1 - A[i][j];
}
}
return B;
}
}
```
> 此处使用了空间换复杂度 时间 O(N),空间 O(1)
**反思**其实作者真正出这个题目,不想让我们循环遍历两次得到最终结果,而是只需要遍历一次,我们在观察下 `[[1,0,0],[0,0,0],[1,0,1]]` -> `[[1,1,0],[1,1,1],[0,1,0]]` 每一个数组中只要首位依次比较只要是不相同的最终转换完之后还是保持不变,相反首位相同的则需要反转。
### Code 03
```java
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
int number = A.length;
for (int i = 0; i < number; i++) {
for (int j = 0 ; j < (number+1) / 2; j++) {
if (A[i][j] == A[i][number - j -1]) {
A[i][number-j-1] = A[i][j] ^= 1;
}
}
}
return A;
}
}
```
> 时间 O(N),空间 O(1) 比之前方法上从空间与时间对比都是最快的
## 心得
**坚持**思考之后多去借鉴下别人的想法,从中会学到很多巧妙之法.
> 潜心修炼 为往圣继绝学!

諾'832. 翻转图像(数组)