日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode-翻转图像(832)

發(fā)布時(shí)間:2025/3/15 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode-翻转图像(832) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述
給定一個(gè)二進(jìn)制矩陣 A,我們想先水平翻轉(zhuǎn)圖像,然后反轉(zhuǎn)圖像并返回結(jié)果。
水平翻轉(zhuǎn)圖片就是將圖片的每一行都進(jì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,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]]

解題思路
最直觀的做法是首先對(duì)矩陣 A 的每一行進(jìn)行水平翻轉(zhuǎn)操作,然后對(duì)矩陣中的每個(gè)元素進(jìn)行反轉(zhuǎn)操作。該做法需要遍歷矩陣兩次。
其實(shí)只需要遍歷一次矩陣就可以完成這些操作。
假設(shè)矩陣的行數(shù)和列數(shù)都是 n,考慮列下標(biāo)left 和 right,其中l(wèi)eft<right 且 left+right=n?1,當(dāng) 0≤i<n 時(shí),對(duì)第 i行進(jìn)行水平翻轉(zhuǎn)之后,A[i][left] 和 A[i][right] 的元素值會(huì)互換,進(jìn)行反轉(zhuǎn)之后,]A[i][left] 和 A[i][right] 的元素值都會(huì)改變。
具體而言,考慮以下四種情況。
情況一:A[i][left]=0,A[i][right]=0。對(duì)第 i行進(jìn)行水平翻轉(zhuǎn)之后,A[i][left]=0,A[i][right]=0。進(jìn)行反轉(zhuǎn)之后,A[i][left]=1,A[i][right]=1。

情況二:A[i][left]=1,A[i][right]=1。對(duì)第 i 行進(jìn)行水平翻轉(zhuǎn)之后,A[i][left]=1,A[i][right]=1。進(jìn)行反轉(zhuǎn)之后,A[i][left]=0,A[i][right]=0。

情況三:A[i][left]=0,A[i][right]=1。對(duì)第 i 行進(jìn)行水平翻轉(zhuǎn)之后,A[i][left]=1,A[i][right]=0。進(jìn)行反轉(zhuǎn)之后A[i][left]=0,A[i][right]=1。

情況四:A[i][left]=1,A[i][right]=0。對(duì)第 i行進(jìn)行水平翻轉(zhuǎn)之后,A[i][left]=0,A[i][right]=1。進(jìn)行反轉(zhuǎn)之后,A[i][left]=1,A[i][right]=0。

情況一和情況二是A[i][left]=A[i][right] 的情況。在進(jìn)行水平翻轉(zhuǎn)和反轉(zhuǎn)之后,A[i][left] 和 A[i][right] 的元素值都發(fā)生了改變,即元素值被反轉(zhuǎn)。
情況三和情況四是A[i][left] =A[i][right] 的情況。在進(jìn)行水平翻轉(zhuǎn)和反轉(zhuǎn)之后A[i][left] 和 A[i][right] 的元素值都發(fā)生了兩次改變,恢復(fù)原狀。

因此,可以遍歷矩陣一次即完成水平翻轉(zhuǎn)和反轉(zhuǎn)。

遍歷矩陣的每一行。對(duì)于矩陣的第 i 行,初始化left=0 和right=n?1,進(jìn)行如下操作:
當(dāng) left<right 時(shí),判斷 A[i][left] 和 A[i][right] 是否相等,如果相等則對(duì) A[i][left] 和 A[i][right] 的值進(jìn)行反轉(zhuǎn),如果不相等則不進(jìn)行任何操作;
將left 的值加 1,將 right 的值減 1,重復(fù)上述操作,直到left≥right;

如果 n 是奇數(shù),則上述操作結(jié)束時(shí),left 和 right 的值相等,都指向第 i 行的中間元素,此時(shí)需要對(duì)中間元素的值進(jìn)行反轉(zhuǎn)。

代碼:

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;} };

總結(jié)

以上是生活随笔為你收集整理的Leetcode-翻转图像(832)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。