給定一個二進制矩陣 A,咱們想先水平翻轉圖像,而後反轉圖像並返回結果java
水平翻轉圖片就是將圖片的每一行都進行翻轉,即逆序。例如,水平翻轉 [1, 1, 0] 的結果是 [0, 1, 1]code
反轉圖片的意思是圖片中的 0 所有被 1 替換, 1 所有被 0 替換。例如,反轉 [0, 1, 1] 的結果是 [1, 0, 0]圖片
示例以下:ip
輸入:[[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]]
最直觀的作法:首先對矩陣 A 的每一行進行水平翻轉操做,而後對矩陣中的每一個元素進行反轉操做,該作法須要遍歷矩陣兩次io
class Solution { public int[][] flipAndInvertImage(int[][] A) { for(int i = 0; i < A.length; i++) { reverse(A[i]); for(int j = 0; j < A[i].length; j++) { A[i][j] ^= 1; } } return A; } private void reverse(int[] array) { int low = 0, high = array.length - 1; while(low < high) { int temp = array[low]; array[low] = array[high]; array[high] = temp; low++; high--; } } }
若是隻但願遍歷一次,就要作到在翻轉行的同時反轉元素。在翻轉行時,咱們能夠同時修改了左右對稱的兩個元素,其規律以下:class
class Solution { public int[][] flipAndInvertImage(int[][] A) { for (int i = 0; i < A.length; i++) { int low = 0, high = A[i].length - 1; while (low < high) { if (A[i][low] == A[i][high]) { A[i][low] ^= 1; A[i][high] ^= 1; } low++; high--; } if (low == high) { A[i][low] ^= 1; } } return A; } }