832. Flipping an Image
Description
Given an n x n binary matrix image, 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: image = [[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: image = [[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]]
Constraints:
n == image.lengthn == image[i].length1 <= n <= 20images[i][j]is either0or1.
Solutions
Solution 1: Two Pointers
Thinking
Each row is reversed then inverted. \(n\le 20\), so two pointers can do both steps in place.
Equal ends stay equal after reverse, so both bits flip. Unequal ends swap under reverse-and-invert, so they need no write. A middle cell is inverted alone.
We can traverse the matrix, and for each row \(\textit{row}\), we use two pointers \(i\) and \(j\) pointing to the first and last elements of the row, respectively. If \(\textit{row}[i] = \textit{row}[j]\), swapping them will keep their values unchanged, so we only need to XOR invert \(\textit{row}[i]\) and \(\textit{row}[j]\), then move \(i\) and \(j\) one position towards the center until \(i \geq j\). If \(\textit{row}[i] \neq \textit{row}[j]\), swapping and then inverting their values will also keep them unchanged, so no operation is needed.
Finally, if \(i = j\), we directly invert \(\textit{row}[i]\).
The time complexity is \(O(n^2)\), where \(n\) is the number of rows or columns in the matrix. The space complexity is \(O(1)\).
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |