給定一個二進制矩陣 A拌倍,我們想先水平翻轉(zhuǎn)圖像,然后反轉(zhuǎn)圖像并返回結(jié)果涯穷。
水平翻轉(zhuǎn)圖片就是將圖片的每一行都進行翻轉(zhuǎn)棍掐,即逆序。例如拷况,水平翻轉(zhuǎn) [1, 1, 0] 的結(jié)果是 [0, 1, 1]作煌。
反轉(zhuǎn)圖片的意思是圖片中的 0 全部被 1 替換, 1 全部被 0 替換蝠嘉。例如最疆,反轉(zhuǎn) [0, 1, 1] 的結(jié)果是 [1, 0, 0]。
示例 1:
輸入: [[1,1,0],[1,0,1],[0,0,0]]
輸出: [[1,0,0],[0,1,0],[1,1,1]]
解釋: 首先翻轉(zhuǎn)每一行: [[0,1,1],[1,0,1],[0,0,0]]蚤告;
然后反轉(zhuǎn)圖片: [[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]]
解釋: 首先翻轉(zhuǎn)每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]努酸;
然后反轉(zhuǎn)圖片: [[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
思路
其實就是同行對稱交換的同時,反轉(zhuǎn)結(jié)果
兩個for循環(huán)杜恰,一個用來遍歷所有行
每一行再遍歷每一項获诈,只需要遍歷到中間元素就可以了,否則會出現(xiàn)重復(fù)交換的問題
具體代碼
class Solution {
public void swap(int[][] A, int x, int y1, int y2){
if(y1 == y2){ //如果是中間元素心褐,就只反轉(zhuǎn)就行
A[x][y1] = 1 - A[x][y1];
return;
}
//非中間元素舔涎,邊交換邊反轉(zhuǎn)
int t = 1 - A[x][y1];
A[x][y1] = 1 - A[x][y2];
A[x][y2] = t;
return;
}
public int[][] flipAndInvertImage(int[][] A) {
int len = A.length;
for(int i = 0; i < len; i++){ //遍歷所有行
for(int j = 0; j <= (len - 1) / 2; j++){ //每行從兩側(cè)向中間交換
swap(A, i, j, len - j - 1); //調(diào)用交換函數(shù)
}
}
return A;
}
}