題目:
題目鏈接
給定一個(gè)二進(jìn)制矩陣 A赃绊,我們想先水平翻轉(zhuǎn)圖像,然后反轉(zhuǎn)圖像并返回結(jié)果辫诅。
水平翻轉(zhuǎn)圖片就是將圖片的每一行都進(jìn)行翻轉(zhuǎn)凭戴,即逆序。例如炕矮,水平翻轉(zhuǎn) [1, 1, 0] 的結(jié)果是 [0, 1, 1]么夫。
給定一個(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,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
解題思路:
首先根據(jù)題目給的思路來,對(duì)數(shù)據(jù)進(jìn)行一次遍歷宁昭,交換對(duì)應(yīng)位置上的數(shù)據(jù)跌宛。
//獲取輸入數(shù)據(jù)
int len_h = A.size(); //獲取行數(shù)
int len_w = A[0].size()-1; //獲取列數(shù),這里為了方便后面使用积仗,-1對(duì)應(yīng)下標(biāo)
之后遍歷每一行的前一半的列疆拘,判斷數(shù)據(jù),先取反再交換位置
這里直接暴力實(shí)現(xiàn)
for(int i = 0; i < len_h; i++){ //按行遍歷
for(int j = 0; j <= len_w/2; j++){ //遍歷前一半的數(shù)據(jù)
int temp = 0; //用于交換位置的輔助存儲(chǔ)
if(A[i][j] == 0)
A[i][j] = 1;
else
A[i][j] = 0; //對(duì)A[i][j]取反
if(A[i][len_w-j] == 0)
A[i][len_w-j] = 1;
else
A[i][len_w-j] = 0; //根據(jù)j的值定位對(duì)應(yīng)位置的值寂曹,并取反
temp = A[i][len_w-j];
A[i][len_w-j] = A[i][j];
A[i][j] = temp; //交換數(shù)據(jù)
if(j == len_w-j){ //若是長度為奇數(shù)哎迄,對(duì)上述遍歷不到的最中間的一位進(jìn)行取反
if(A[i][j] == 0)
A[i][j] = 1;
else
A[i][j] = 0;
}
}
}
這樣唯一使用到的知識(shí)點(diǎn)就是交換數(shù)據(jù)的三行代碼,ヽ(ー_ー)ノ
到這里基本就完成了稀颁,最后把二維容器A返回即可芬失。
升級(jí)版
上述代碼能夠成功AC,但是時(shí)間效率和空間效率都明顯略低匾灶,特別是時(shí)間效率
執(zhí)行用時(shí) : 36 ms, 在Flipping an Image的C++提交中擊敗了28.76% 的用戶
內(nèi)存消耗 : 9.4 MB, 在Flipping an Image的C++提交中擊敗了70.61% 的用戶
接下來對(duì)代碼進(jìn)行優(yōu)化棱烂,先從原理開始,既然想要優(yōu)化就不能按照題目中描述的直接暴力解題了阶女,需要找到其中的癥結(jié)所在颊糜。
這題能夠優(yōu)化的內(nèi)容在于,對(duì)于對(duì)應(yīng)位置上相等的數(shù)據(jù)秃踩,可以不進(jìn)行數(shù)據(jù)交換衬鱼,直接取反即可
class Solution {
public:
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
int len_h = A.size();
int len_w = A[0].size();
for(int i=0;i<len_h;i++)
{
for(int j=len_w/2;j<len_w;j++)//A[i].size()-1-j
{
if(A[i][len_w-1-j]==A[i][j])
{
if(A[i][j]==1)
{
A[i][j]=0;
A[i][len_w-1-j]=0;
}
else
{
A[i][j]=1;
A[i][len_w-1-j]=1;
}
}
}
}
return A;
}
};
優(yōu)化后的代碼時(shí)間效率有明顯提升
執(zhí)行用時(shí) : 16 ms, 在Flipping an Image的C++提交中擊敗了96.83% 的用戶
內(nèi)存消耗 : 9.4 MB, 在Flipping an Image的C++提交中擊敗了70.61% 的用戶
到此為止本題已經(jīng)基本解決,感謝閱讀 |??ω?` )