Given a binary matrix A
, we want to flip the image horizontally, then invert it, and return the resulting image.html
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]
.spa
Example 1:code
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:htm
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:blog
1 <= A.length = A[0].length <= 20
0 <= A[i][j] <= 1
這道題讓咱們翻轉圖像,翻轉的方法是對於二維數組的每一行,先將全部元素位置翻轉一下,而後再按順序將每一個像素值取個反。既然要求這麼直接明瞭,那麼就按照其說的一步一步來唄,首先翻轉每一行,記得必定要加 ‘&’ 號,否則原數組不會被修改。而後在遍歷每一個數字,讓其或上1,達到取反的目的,固然仍是必需要加 ‘&’ 號,最後返回修改後的A數組便可,參見代碼以下:ip
解法一:leetcode
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中,這樣直接將翻轉和取反同時完成了,參見代碼以下:get
解法二:it
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