Leetcode-翻转图像(832)
題目描述
給定一個二進制矩陣 A,我們想先水平翻轉圖像,然后反轉圖像并返回結果。
水平翻轉圖片就是將圖片的每一行都進行翻轉,即逆序。例如,水平翻轉 [1, 1, 0] 的結果是 [0, 1, 1]。
反轉圖片的意思是圖片中的 0 全部被 1 替換, 1 全部被 0 替換。例如,反轉 [0, 1, 1] 的結果是 [1, 0, 0]。
示例:
輸入:[[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 的每一行進行水平翻轉操作,然后對矩陣中的每個元素進行反轉操作。該做法需要遍歷矩陣兩次。
其實只需要遍歷一次矩陣就可以完成這些操作。
假設矩陣的行數和列數都是 n,考慮列下標left 和 right,其中left<right 且 left+right=n?1,當 0≤i<n 時,對第 i行進行水平翻轉之后,A[i][left] 和 A[i][right] 的元素值會互換,進行反轉之后,]A[i][left] 和 A[i][right] 的元素值都會改變。
具體而言,考慮以下四種情況。
情況一:A[i][left]=0,A[i][right]=0。對第 i行進行水平翻轉之后,A[i][left]=0,A[i][right]=0。進行反轉之后,A[i][left]=1,A[i][right]=1。
情況二:A[i][left]=1,A[i][right]=1。對第 i 行進行水平翻轉之后,A[i][left]=1,A[i][right]=1。進行反轉之后,A[i][left]=0,A[i][right]=0。
情況三:A[i][left]=0,A[i][right]=1。對第 i 行進行水平翻轉之后,A[i][left]=1,A[i][right]=0。進行反轉之后A[i][left]=0,A[i][right]=1。
情況四:A[i][left]=1,A[i][right]=0。對第 i行進行水平翻轉之后,A[i][left]=0,A[i][right]=1。進行反轉之后,A[i][left]=1,A[i][right]=0。
情況一和情況二是A[i][left]=A[i][right] 的情況。在進行水平翻轉和反轉之后,A[i][left] 和 A[i][right] 的元素值都發生了改變,即元素值被反轉。
情況三和情況四是A[i][left] =A[i][right] 的情況。在進行水平翻轉和反轉之后A[i][left] 和 A[i][right] 的元素值都發生了兩次改變,恢復原狀。
因此,可以遍歷矩陣一次即完成水平翻轉和反轉。
遍歷矩陣的每一行。對于矩陣的第 i 行,初始化left=0 和right=n?1,進行如下操作:
當 left<right 時,判斷 A[i][left] 和 A[i][right] 是否相等,如果相等則對 A[i][left] 和 A[i][right] 的值進行反轉,如果不相等則不進行任何操作;
將left 的值加 1,將 right 的值減 1,重復上述操作,直到left≥right;
如果 n 是奇數,則上述操作結束時,left 和 right 的值相等,都指向第 i 行的中間元素,此時需要對中間元素的值進行反轉。
代碼:
class Solution:def flipAndInvertImage(self, A: List[List[int]]) -> List[List[int]]:n = len(A)for i in range(n):left ,right = 0,n-1while left < right:if A[i][left] == A[i][right]:A[i][left] ^= 1A[i][right] ^= 1left +=1right -=1if left == right:A[i][left] ^=1return A class Solution {public int[][] flipAndInvertImage(int[][] A) {int n = A.length;for(int i = 0; i < n ; ++i){int left = 0, right = n - 1;while(left < right){if(A[i][left]==A[i][right]){A[i][left] ^= 1;A[i][right] ^=1;}left++;right--;}if(left==right){A[i][left] ^=1;}}return A;} } class Solution { public:vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {int n = A.size();for(int i = 0; i < n; i++){int left = 0, right = n-1;while(left < right){if(A[i][left] == A[i][right]){A[i][left] ^= 1;A[i][right] ^=1;}left ++;right --;}if(left==right){A[i][left] ^=1;}}return A;} };總結
以上是生活随笔為你收集整理的Leetcode-翻转图像(832)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zabbix邮件报警
- 下一篇: Leetcode- Z 字形变换(6)