翻轉圖像

題目概述

給定一個二進制矩陣 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

  • 若是兩個元素相同,那麼同時進行反轉,例如兩個元素都爲 1 或 0,很顯然,在進行了翻轉和反轉操做後,兩個元素都將變爲 0 或 1
  • 若是兩個元素不相同,那麼保持不變,例如兩個元素分別爲 [1,0] 或 [0,1],很顯然,在進行了翻轉和反轉操做後,兩個元素的值不會發生變化
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;
    }
}
相關文章
相關標籤/搜索