Given a binary matrix A
, we want to flip the image horizontally, then invert it, and return the resulting image.
To flip an image horizontally means that each row of the image is reversed. For example, flipping [1, 1, 0]
horizontally results in [0, 1, 1]
.
To invert an image means that each 0
is replaced by 1
, and each 1
is replaced by 0
. For example, inverting [0, 1, 1]
results in [1, 0, 0]
.
Example 1:
Input: [[1,1,0],[1,0,1],[0,0,0]] Output: [[1,0,0],[0,1,0],[1,1,1]] Explanation: First reverse each row: [[0,1,1],[1,0,1],[0,0,0]]. Then, invert the image: [[1,0,0],[0,1,0],[1,1,1]]
Example 2:
Input: [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]] Output: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]] Explanation: First reverse each row: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]. Then invert the image: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
Notes:
1 <= A.length = A[0].length <= 20
0 <= A[i][j] <= 1
這道題讓我們翻轉圖像,翻轉的方法是對於二維數組的每一行,先將所有元素位置翻轉一下,然后再按順序將每個像素值取個反。既然要求這么直接明了,那么就按照其說的一步一步來唄,首先翻轉每一行,記得一定要加 ‘&’ 號,不然原數組不會被修改。然后在遍歷每個數字,讓其或上1,達到取反的目的,當然還是必須要加 ‘&’ 號,最后返回修改后的A數組即可,參見代碼如下:
解法一:
class Solution { public: vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) { for (auto &row : A) reverse(row.begin(), row.end()); for (auto &row : A) { for (int &num : row) num ^= 1; } return A; } };
上面的方法雖然直接了當,但是畢竟修改了原數組A,再來看一種不修改的方法,這里我們新建一個跟A一樣長的二維數組,只不過里面的各行還是空的。然后我們遍歷A數組的各行,但在遍歷各行上的數字時,我們采用從后往前的遍歷順序,然后對於每個數字取反在加入結果res中,這樣直接將翻轉和取反同時完成了,參見代碼如下:
解法二:
class Solution { public: vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) { vector<vector<int>> res(A.size()); for (int i = 0; i < A.size(); ++i) { for (int j = (int)A[i].size() - 1; j >= 0; --j) { res[i].push_back(!A[i][j]); } } return res; } };
參考資料:
https://leetcode.com/problems/flipping-an-image/
https://leetcode.com/problems/flipping-an-image/discuss/130590/C%2B%2BJavaPython-Reverse-and-Toggle