傳送門c++
給定一個二進制矩陣 A,咱們想先水平翻轉圖像,而後反轉圖像並返回結果。
水平翻轉圖片就是將圖片的每一行都進行翻轉,即逆序。例如,水平翻轉 [1, 1, 0] 的結果是 [0, 1, 1]。
反轉圖片的意思是圖片中的 0 所有被 1 替換, 1 所有被 0 替換。例如,反轉 [0, 1, 1] 的結果是 [1, 0, 0]。數組
示例 1:code
輸入: [[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]]blog
示例 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]]
解釋: 首先翻轉每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]];
而後反轉圖片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]ip
說明:leetcode
1 <= A.length = A[0].length <= 20 0 <= A[i][j] <= 1
來源:力扣(LeetCode)。get
/** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned as *returnColumnSizes array. * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free(). *返回一個數組的大小。 *數組的大小以*returnColumnSizes數組的形式返回。 *注意:返回的數組和*columnSizes數組必須是malloced(),假設調用方調用free()。 */ int** flipAndInvertImage(int** A, int ASize, int* AColSize, int* returnSize, int** returnColumnSizes){ }
咱們來觀察一下下面的兩個數組
若是把中間狀態取消不看,你會發現,這個轉化有一個規律,就是基於中間位置對稱,若是先後對稱位置的元素相同,那麼轉化後這兩個位置的元素都會與原來不一樣,可是若是不是相同的那麼轉化後仍是和原先是同樣的元素。
下圖用‘-’來表示非的意思
因此說想要實現題目要求能夠直接進行一個相似於迴文判斷而後就能夠直接決定元素需不須要更改。
首先天然是初始化源碼
*returnSize = ASize; returnColumnSizes[0] = AColSize;
而後進行判斷,判斷後直接進行決策填充模板
for (int r = 0; r < ASize; r++) for (int c = 0; c < (AColSize[r] + 1) / 2; c++) if (A[r][c] == A[r][AColSize[r] - 1 - c]) A[r][c] = A[r][AColSize[r] - 1 - c] = 1 - A[r][c];
最後返回便可,十分簡單。
int** flipAndInvertImage(int** A, int ASize, int* AColSize, int* returnSize, int** returnColumnSizes){ *returnSize = ASize; returnColumnSizes[0] = AColSize; for (int r = 0; r < ASize; r++) for (int c = 0; c < (AColSize[r] + 1) / 2; c++) if (A[r][c] == A[r][AColSize[r] - 1 - c]) A[r][c] = A[r][AColSize[r] - 1 - c] = 1 - A[r][c]; return A; }