给定一个二进制矩阵 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
思路一:另用一个空数组 B 数组用于保存翻转后的数组,将原序数组的每一行倒序输出到 B 数组的每一行,这样就实现了倒序输出,然后再遍历数组将 0 变成 1, 1 变成 0。
代码:
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
int len = A.length,k = 0;
int[][] B = new int[len][len];
for(int i = 0;i < A.length;i++){
k=0;
for(int j = A[i].length-1;j >=0 &&k < len ;j--){
B[i][k++] = A[i][j];
}
}
for(int i = 0;i < B.length;i++){
for(int j = 0;j < B[i].length;j++){
if(B[i][j]==1){
B[i][j] = 0;
}else{
B[i][j] = 1;
}
}
}
return B;
}
}
思路二:对矩阵的每一行进行操作,用两个指针 left 和 right,利用二分的思想进行交换,然后用 1 减去每一行的元素,就实现了1 变成 0,0 变成 1。
代码:
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
for(int i=0;i<A.length;i++) {
int left = 0;
int right = A[i].length-1;
while(left < right) {
int temp = 1-A[i][left];
A[i][left] = 1-A[i][right];
A[i][right] = temp;
left++;
right--;
}
if(left == right) A[i][left] = 1-A[i][left];
}
return A;
}
}