diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/README.md b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/README.md index 92930dc382eca..d52e267159af3 100644 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/README.md +++ b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/README.md @@ -64,9 +64,13 @@ tags: -### 方法一:模拟旋转 +### 方法一:原地比较 -旋转矩阵,判断矩阵是否一致,旋转方式同 [48. 旋转图像](https://leetcode.cn/problems/rotate-image/)。 +我们观察矩阵的轮转规律,发现对于矩阵中的元素 $\text{mat}[i][j]$,它在轮转 90 度后会出现在 $\text{mat}[j][n-1-i]$ 的位置,在轮转 180 度后会出现在 $\text{mat}[n-1-i][n-1-j]$ 的位置,在轮转 270 度后会出现在 $\text{mat}[n-1-j][i]$ 的位置。 + +因此,我们可以用一个整数 $\textit{ok}$ 来记录当前轮转的状态,初始值为 $0b1111$,表示四种轮转状态都可能。对于矩阵中的每个元素,我们比较它在不同轮转状态下的位置与目标矩阵中的对应位置的元素是否相等,如果不相等,则将对应的轮转状态从 $\textit{ok}$ 中去掉。最后,如果 $\textit{ok}$ 不为零,说明至少有一种轮转状态可以使矩阵与目标矩阵一致,返回 $\textit{true}$;否则,返回 $\textit{false}$。 + +时间复杂度 $O(n^2)$,其中 $n$ 是矩阵的大小。空间复杂度 $O(1)$。 @@ -75,21 +79,21 @@ tags: ```python class Solution: def findRotation(self, mat: List[List[int]], target: List[List[int]]) -> bool: - def rotate(matrix): - n = len(matrix) - for i in range(n // 2): - for j in range(i, n - 1 - i): - t = matrix[i][j] - matrix[i][j] = matrix[n - j - 1][i] - matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1] - matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1] - matrix[j][n - i - 1] = t - - for _ in range(4): - if mat == target: - return True - rotate(mat) - return False + n = len(mat) + ok = 0b1111 + for i in range(n): + for j in range(n): + if mat[i][j] != target[i][j]: + ok &= ~0b0001 + if mat[j][n - 1 - i] != target[i][j]: + ok &= ~0b0010 + if mat[n - 1 - i][n - 1 - j] != target[i][j]: + ok &= ~0b0100 + if mat[n - 1 - j][i] != target[i][j]: + ok &= ~0b1000 + if ok == 0: + return False + return ok != 0 ``` #### Java @@ -97,39 +101,28 @@ class Solution: ```java class Solution { public boolean findRotation(int[][] mat, int[][] target) { - int times = 4; - while (times-- > 0) { - if (equals(mat, target)) { - return true; - } - rotate(mat); - } - return false; - } - - private void rotate(int[][] matrix) { - int n = matrix.length; - for (int i = 0; i < n / 2; ++i) { - for (int j = i; j < n - 1 - i; ++j) { - int t = matrix[i][j]; - matrix[i][j] = matrix[n - j - 1][i]; - matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1]; - matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1]; - matrix[j][n - i - 1] = t; - } - } - } - - private boolean equals(int[][] nums1, int[][] nums2) { - int n = nums1.length; - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { - if (nums1[i][j] != nums2[i][j]) { + int n = mat.length; + int ok = 0b1111; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (mat[i][j] != target[i][j]) { + ok &= ~0b0001; + } + if (mat[j][n - 1 - i] != target[i][j]) { + ok &= ~0b0010; + } + if (mat[n - 1 - i][n - 1 - j] != target[i][j]) { + ok &= ~0b0100; + } + if (mat[n - 1 - j][i] != target[i][j]) { + ok &= ~0b1000; + } + if (ok == 0) { return false; } } } - return true; + return ok != 0; } } ``` @@ -141,15 +134,27 @@ class Solution { public: bool findRotation(vector>& mat, vector>& target) { int n = mat.size(); - for (int k = 0; k < 4; ++k) { - vector> g(n, vector(n)); - for (int i = 0; i < n; ++i) - for (int j = 0; j < n; ++j) - g[i][j] = mat[j][n - i - 1]; - if (g == target) return true; - mat = g; + int ok = 0b1111; + for (int i = 0; i < n; ++i) { + for (int j = 0; j < n; ++j) { + if (mat[i][j] != target[i][j]) { + ok &= ~0b0001; + } + if (mat[j][n - 1 - i] != target[i][j]) { + ok &= ~0b0010; + } + if (mat[n - 1 - i][n - 1 - j] != target[i][j]) { + ok &= ~0b0100; + } + if (mat[n - 1 - j][i] != target[i][j]) { + ok &= ~0b1000; + } + if (ok == 0) { + return false; + } + } } - return false; + return ok != 0; } }; ``` @@ -158,34 +163,30 @@ public: ```go func findRotation(mat [][]int, target [][]int) bool { - n := len(mat) - for k := 0; k < 4; k++ { - g := make([][]int, n) - for i := range g { - g[i] = make([]int, n) - } - for i := 0; i < n; i++ { - for j := 0; j < n; j++ { - g[i][j] = mat[j][n-i-1] - } - } - if equals(g, target) { - return true - } - mat = g - } - return false -} + n := len(mat) + ok := 0b1111 -func equals(a, b [][]int) bool { - for i, row := range a { - for j, v := range row { - if v != b[i][j] { - return false - } - } - } - return true + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + if mat[i][j] != target[i][j] { + ok &= ^0b0001 + } + if mat[j][n-1-i] != target[i][j] { + ok &= ^0b0010 + } + if mat[n-1-i][n-1-j] != target[i][j] { + ok &= ^0b0100 + } + if mat[n-1-j][i] != target[i][j] { + ok &= ^0b1000 + } + if ok == 0 { + return false + } + } + } + + return ok != 0 } ``` @@ -193,44 +194,30 @@ func equals(a, b [][]int) bool { ```ts function findRotation(mat: number[][], target: number[][]): boolean { - for (let k = 0; k < 4; k++) { - rotate(mat); - if (isEqual(mat, target)) { - return true; - } - } - return false; -} + const n = mat.length; + let ok = 0b1111; -function isEqual(A: number[][], B: number[][]) { - const n = A.length; for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { - if (A[i][j] !== B[i][j]) { + if (mat[i][j] !== target[i][j]) { + ok &= ~0b0001; + } + if (mat[j][n - 1 - i] !== target[i][j]) { + ok &= ~0b0010; + } + if (mat[n - 1 - i][n - 1 - j] !== target[i][j]) { + ok &= ~0b0100; + } + if (mat[n - 1 - j][i] !== target[i][j]) { + ok &= ~0b1000; + } + if (ok === 0) { return false; } } } - return true; -} -function rotate(matrix: number[][]): void { - const n = matrix.length; - for (let i = 0; i < n >> 1; i++) { - for (let j = 0; j < (n + 1) >> 1; j++) { - [ - matrix[i][j], - matrix[n - 1 - j][i], - matrix[n - 1 - i][n - 1 - j], - matrix[j][n - 1 - i], - ] = [ - matrix[n - 1 - j][i], - matrix[n - 1 - i][n - 1 - j], - matrix[j][n - 1 - i], - matrix[i][j], - ]; - } - } + return ok !== 0; } ``` @@ -240,92 +227,29 @@ function rotate(matrix: number[][]): void { impl Solution { pub fn find_rotation(mat: Vec>, target: Vec>) -> bool { let n = mat.len(); - let mut is_equal = [true; 4]; + let mut ok: i32 = 0b1111; + for i in 0..n { for j in 0..n { - if is_equal[0] && mat[i][j] != target[i][j] { - is_equal[0] = false; + if mat[i][j] != target[i][j] { + ok &= !0b0001; } - if is_equal[1] && mat[i][j] != target[j][n - 1 - i] { - is_equal[1] = false; + if mat[j][n - 1 - i] != target[i][j] { + ok &= !0b0010; } - if is_equal[2] && mat[i][j] != target[n - 1 - i][n - 1 - j] { - is_equal[2] = false; + if mat[n - 1 - i][n - 1 - j] != target[i][j] { + ok &= !0b0100; } - if is_equal[3] && mat[i][j] != target[n - 1 - j][i] { - is_equal[3] = false; + if mat[n - 1 - j][i] != target[i][j] { + ok &= !0b1000; } - } - } - is_equal.into_iter().any(|&v| v) - } -} -``` - - - - - - - -### 方法二:原地比较 - -此题不同于 [48. 旋转图像](https://leetcode.cn/problems/rotate-image/),并不要求改动原数组,因此,只要比较对应的位置即可。 - -| 旋转度数 | A | B | -| -------- | ------ | -------------- | -| 0 | `i, j` | `i, j` | -| 90 | `i, j` | `j, n - i` | -| 180 | `i, j` | `n - i, n - j` | -| 270 | `i, j` | `n - j, i` | - -> `n = A.length - 1 = B.length - 1` - - - -#### Python3 - -```python -class Solution: - def findRotation(self, mat: List[List[int]], target: List[List[int]]) -> bool: - for _ in range(4): - mat = [list(col) for col in zip(*mat[::-1])] - if mat == target: - return True - return False -``` - -#### Java - -```java -class Solution { - public boolean findRotation(int[][] mat, int[][] target) { - int n = mat.length; - for (int k = 0; k < 4; ++k) { - int[][] g = new int[n][n]; - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { - g[i][j] = mat[j][n - i - 1]; - } - } - if (equals(g, target)) { - return true; - } - mat = g; - } - return false; - } - - private boolean equals(int[][] a, int[][] b) { - int n = a.length; - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { - if (a[i][j] != b[i][j]) { + if ok == 0 { return false; } } } - return true; + + ok != 0 } } ``` diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/README_EN.md b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/README_EN.md index 05c86d2764451..0ee32c5f5b2e0 100644 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/README_EN.md +++ b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/README_EN.md @@ -62,7 +62,13 @@ tags: -### Solution 1 +### Solution 1: In-Place Comparison + +We observe the rotation pattern of the matrix and find that for an element $\text{mat}[i][j]$, after rotating 90 degrees it appears at position $\text{mat}[j][n-1-i]$, after rotating 180 degrees it appears at position $\text{mat}[n-1-i][n-1-j]$, and after rotating 270 degrees it appears at position $\text{mat}[n-1-j][i]$. + +Therefore, we can use an integer $\textit{ok}$ to record the current rotation state, initialized to $0b1111$, indicating that all four rotation states are possible. For each element in the matrix, we compare whether its position under different rotation states matches the corresponding element in the target matrix. If they are not equal, we remove that rotation state from $\textit{ok}$. Finally, if $\textit{ok}$ is not zero, it means at least one rotation state can make the matrix consistent with the target matrix, and we return $\textit{true}$; otherwise, we return $\textit{false}$. + +The time complexity is $O(n^2)$, where $n$ is the size of the matrix. The space complexity is $O(1)$. @@ -71,21 +77,21 @@ tags: ```python class Solution: def findRotation(self, mat: List[List[int]], target: List[List[int]]) -> bool: - def rotate(matrix): - n = len(matrix) - for i in range(n // 2): - for j in range(i, n - 1 - i): - t = matrix[i][j] - matrix[i][j] = matrix[n - j - 1][i] - matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1] - matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1] - matrix[j][n - i - 1] = t - - for _ in range(4): - if mat == target: - return True - rotate(mat) - return False + n = len(mat) + ok = 0b1111 + for i in range(n): + for j in range(n): + if mat[i][j] != target[i][j]: + ok &= ~0b0001 + if mat[j][n - 1 - i] != target[i][j]: + ok &= ~0b0010 + if mat[n - 1 - i][n - 1 - j] != target[i][j]: + ok &= ~0b0100 + if mat[n - 1 - j][i] != target[i][j]: + ok &= ~0b1000 + if ok == 0: + return False + return ok != 0 ``` #### Java @@ -93,39 +99,28 @@ class Solution: ```java class Solution { public boolean findRotation(int[][] mat, int[][] target) { - int times = 4; - while (times-- > 0) { - if (equals(mat, target)) { - return true; - } - rotate(mat); - } - return false; - } - - private void rotate(int[][] matrix) { - int n = matrix.length; - for (int i = 0; i < n / 2; ++i) { - for (int j = i; j < n - 1 - i; ++j) { - int t = matrix[i][j]; - matrix[i][j] = matrix[n - j - 1][i]; - matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1]; - matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1]; - matrix[j][n - i - 1] = t; - } - } - } - - private boolean equals(int[][] nums1, int[][] nums2) { - int n = nums1.length; - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { - if (nums1[i][j] != nums2[i][j]) { + int n = mat.length; + int ok = 0b1111; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (mat[i][j] != target[i][j]) { + ok &= ~0b0001; + } + if (mat[j][n - 1 - i] != target[i][j]) { + ok &= ~0b0010; + } + if (mat[n - 1 - i][n - 1 - j] != target[i][j]) { + ok &= ~0b0100; + } + if (mat[n - 1 - j][i] != target[i][j]) { + ok &= ~0b1000; + } + if (ok == 0) { return false; } } } - return true; + return ok != 0; } } ``` @@ -137,15 +132,27 @@ class Solution { public: bool findRotation(vector>& mat, vector>& target) { int n = mat.size(); - for (int k = 0; k < 4; ++k) { - vector> g(n, vector(n)); - for (int i = 0; i < n; ++i) - for (int j = 0; j < n; ++j) - g[i][j] = mat[j][n - i - 1]; - if (g == target) return true; - mat = g; + int ok = 0b1111; + for (int i = 0; i < n; ++i) { + for (int j = 0; j < n; ++j) { + if (mat[i][j] != target[i][j]) { + ok &= ~0b0001; + } + if (mat[j][n - 1 - i] != target[i][j]) { + ok &= ~0b0010; + } + if (mat[n - 1 - i][n - 1 - j] != target[i][j]) { + ok &= ~0b0100; + } + if (mat[n - 1 - j][i] != target[i][j]) { + ok &= ~0b1000; + } + if (ok == 0) { + return false; + } + } } - return false; + return ok != 0; } }; ``` @@ -154,34 +161,30 @@ public: ```go func findRotation(mat [][]int, target [][]int) bool { - n := len(mat) - for k := 0; k < 4; k++ { - g := make([][]int, n) - for i := range g { - g[i] = make([]int, n) - } - for i := 0; i < n; i++ { - for j := 0; j < n; j++ { - g[i][j] = mat[j][n-i-1] - } - } - if equals(g, target) { - return true - } - mat = g - } - return false -} + n := len(mat) + ok := 0b1111 -func equals(a, b [][]int) bool { - for i, row := range a { - for j, v := range row { - if v != b[i][j] { - return false - } - } - } - return true + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + if mat[i][j] != target[i][j] { + ok &= ^0b0001 + } + if mat[j][n-1-i] != target[i][j] { + ok &= ^0b0010 + } + if mat[n-1-i][n-1-j] != target[i][j] { + ok &= ^0b0100 + } + if mat[n-1-j][i] != target[i][j] { + ok &= ^0b1000 + } + if ok == 0 { + return false + } + } + } + + return ok != 0 } ``` @@ -189,44 +192,30 @@ func equals(a, b [][]int) bool { ```ts function findRotation(mat: number[][], target: number[][]): boolean { - for (let k = 0; k < 4; k++) { - rotate(mat); - if (isEqual(mat, target)) { - return true; - } - } - return false; -} + const n = mat.length; + let ok = 0b1111; -function isEqual(A: number[][], B: number[][]) { - const n = A.length; for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { - if (A[i][j] !== B[i][j]) { + if (mat[i][j] !== target[i][j]) { + ok &= ~0b0001; + } + if (mat[j][n - 1 - i] !== target[i][j]) { + ok &= ~0b0010; + } + if (mat[n - 1 - i][n - 1 - j] !== target[i][j]) { + ok &= ~0b0100; + } + if (mat[n - 1 - j][i] !== target[i][j]) { + ok &= ~0b1000; + } + if (ok === 0) { return false; } } } - return true; -} -function rotate(matrix: number[][]): void { - const n = matrix.length; - for (let i = 0; i < n >> 1; i++) { - for (let j = 0; j < (n + 1) >> 1; j++) { - [ - matrix[i][j], - matrix[n - 1 - j][i], - matrix[n - 1 - i][n - 1 - j], - matrix[j][n - 1 - i], - ] = [ - matrix[n - 1 - j][i], - matrix[n - 1 - i][n - 1 - j], - matrix[j][n - 1 - i], - matrix[i][j], - ]; - } - } + return ok !== 0; } ``` @@ -236,81 +225,29 @@ function rotate(matrix: number[][]): void { impl Solution { pub fn find_rotation(mat: Vec>, target: Vec>) -> bool { let n = mat.len(); - let mut is_equal = [true; 4]; + let mut ok: i32 = 0b1111; + for i in 0..n { for j in 0..n { - if is_equal[0] && mat[i][j] != target[i][j] { - is_equal[0] = false; - } - if is_equal[1] && mat[i][j] != target[j][n - 1 - i] { - is_equal[1] = false; + if mat[i][j] != target[i][j] { + ok &= !0b0001; } - if is_equal[2] && mat[i][j] != target[n - 1 - i][n - 1 - j] { - is_equal[2] = false; + if mat[j][n - 1 - i] != target[i][j] { + ok &= !0b0010; } - if is_equal[3] && mat[i][j] != target[n - 1 - j][i] { - is_equal[3] = false; + if mat[n - 1 - i][n - 1 - j] != target[i][j] { + ok &= !0b0100; } - } - } - is_equal.into_iter().any(|&v| v) - } -} -``` - - - - - - - -### Solution 2 - - - -#### Python3 - -```python -class Solution: - def findRotation(self, mat: List[List[int]], target: List[List[int]]) -> bool: - for _ in range(4): - mat = [list(col) for col in zip(*mat[::-1])] - if mat == target: - return True - return False -``` - -#### Java - -```java -class Solution { - public boolean findRotation(int[][] mat, int[][] target) { - int n = mat.length; - for (int k = 0; k < 4; ++k) { - int[][] g = new int[n][n]; - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { - g[i][j] = mat[j][n - i - 1]; + if mat[n - 1 - j][i] != target[i][j] { + ok &= !0b1000; } - } - if (equals(g, target)) { - return true; - } - mat = g; - } - return false; - } - - private boolean equals(int[][] a, int[][] b) { - int n = a.length; - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { - if (a[i][j] != b[i][j]) { + if ok == 0 { return false; } } } - return true; + + ok != 0 } } ``` diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.cpp b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.cpp index 1ce36d2b25311..f9b3f902eddb3 100644 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.cpp +++ b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.cpp @@ -2,14 +2,26 @@ class Solution { public: bool findRotation(vector>& mat, vector>& target) { int n = mat.size(); - for (int k = 0; k < 4; ++k) { - vector> g(n, vector(n)); - for (int i = 0; i < n; ++i) - for (int j = 0; j < n; ++j) - g[i][j] = mat[j][n - i - 1]; - if (g == target) return true; - mat = g; + int ok = 0b1111; + for (int i = 0; i < n; ++i) { + for (int j = 0; j < n; ++j) { + if (mat[i][j] != target[i][j]) { + ok &= ~0b0001; + } + if (mat[j][n - 1 - i] != target[i][j]) { + ok &= ~0b0010; + } + if (mat[n - 1 - i][n - 1 - j] != target[i][j]) { + ok &= ~0b0100; + } + if (mat[n - 1 - j][i] != target[i][j]) { + ok &= ~0b1000; + } + if (ok == 0) { + return false; + } + } } - return false; + return ok != 0; } -}; \ No newline at end of file +}; diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.go b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.go index 85c137a24d22b..e34cd5289e614 100644 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.go +++ b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.go @@ -1,30 +1,26 @@ func findRotation(mat [][]int, target [][]int) bool { - n := len(mat) - for k := 0; k < 4; k++ { - g := make([][]int, n) - for i := range g { - g[i] = make([]int, n) - } - for i := 0; i < n; i++ { - for j := 0; j < n; j++ { - g[i][j] = mat[j][n-i-1] - } - } - if equals(g, target) { - return true - } - mat = g - } - return false -} + n := len(mat) + ok := 0b1111 + + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + if mat[i][j] != target[i][j] { + ok &= ^0b0001 + } + if mat[j][n-1-i] != target[i][j] { + ok &= ^0b0010 + } + if mat[n-1-i][n-1-j] != target[i][j] { + ok &= ^0b0100 + } + if mat[n-1-j][i] != target[i][j] { + ok &= ^0b1000 + } + if ok == 0 { + return false + } + } + } -func equals(a, b [][]int) bool { - for i, row := range a { - for j, v := range row { - if v != b[i][j] { - return false - } - } - } - return true -} \ No newline at end of file + return ok != 0 +} diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.java b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.java index d7d5b35f44fab..e27d5fd831219 100644 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.java +++ b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.java @@ -1,37 +1,26 @@ class Solution { public boolean findRotation(int[][] mat, int[][] target) { - int times = 4; - while (times-- > 0) { - if (equals(mat, target)) { - return true; - } - rotate(mat); - } - return false; - } - - private void rotate(int[][] matrix) { - int n = matrix.length; - for (int i = 0; i < n / 2; ++i) { - for (int j = i; j < n - 1 - i; ++j) { - int t = matrix[i][j]; - matrix[i][j] = matrix[n - j - 1][i]; - matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1]; - matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1]; - matrix[j][n - i - 1] = t; - } - } - } - - private boolean equals(int[][] nums1, int[][] nums2) { - int n = nums1.length; - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { - if (nums1[i][j] != nums2[i][j]) { + int n = mat.length; + int ok = 0b1111; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (mat[i][j] != target[i][j]) { + ok &= ~0b0001; + } + if (mat[j][n - 1 - i] != target[i][j]) { + ok &= ~0b0010; + } + if (mat[n - 1 - i][n - 1 - j] != target[i][j]) { + ok &= ~0b0100; + } + if (mat[n - 1 - j][i] != target[i][j]) { + ok &= ~0b1000; + } + if (ok == 0) { return false; } } } - return true; + return ok != 0; } -} \ No newline at end of file +} diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.py b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.py index 8e5dc26a6cf22..29317f11731e6 100644 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.py +++ b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.py @@ -1,17 +1,17 @@ class Solution: def findRotation(self, mat: List[List[int]], target: List[List[int]]) -> bool: - def rotate(matrix): - n = len(matrix) - for i in range(n // 2): - for j in range(i, n - 1 - i): - t = matrix[i][j] - matrix[i][j] = matrix[n - j - 1][i] - matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1] - matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1] - matrix[j][n - i - 1] = t - - for _ in range(4): - if mat == target: - return True - rotate(mat) - return False + n = len(mat) + ok = 0b1111 + for i in range(n): + for j in range(n): + if mat[i][j] != target[i][j]: + ok &= ~0b0001 + if mat[j][n - 1 - i] != target[i][j]: + ok &= ~0b0010 + if mat[n - 1 - i][n - 1 - j] != target[i][j]: + ok &= ~0b0100 + if mat[n - 1 - j][i] != target[i][j]: + ok &= ~0b1000 + if ok == 0: + return False + return ok != 0 diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.rs b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.rs index a70f13c629695..ed6ffcb6f31a4 100644 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.rs +++ b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.rs @@ -1,23 +1,28 @@ impl Solution { pub fn find_rotation(mat: Vec>, target: Vec>) -> bool { let n = mat.len(); - let mut is_equal = [true; 4]; + let mut ok: i32 = 0b1111; + for i in 0..n { for j in 0..n { - if is_equal[0] && mat[i][j] != target[i][j] { - is_equal[0] = false; + if mat[i][j] != target[i][j] { + ok &= !0b0001; } - if is_equal[1] && mat[i][j] != target[j][n - 1 - i] { - is_equal[1] = false; + if mat[j][n - 1 - i] != target[i][j] { + ok &= !0b0010; } - if is_equal[2] && mat[i][j] != target[n - 1 - i][n - 1 - j] { - is_equal[2] = false; + if mat[n - 1 - i][n - 1 - j] != target[i][j] { + ok &= !0b0100; } - if is_equal[3] && mat[i][j] != target[n - 1 - j][i] { - is_equal[3] = false; + if mat[n - 1 - j][i] != target[i][j] { + ok &= !0b1000; + } + if ok == 0 { + return false; } } } - is_equal.into_iter().any(|&v| v) + + ok != 0 } } diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.ts b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.ts index 51a16c3155769..85ae347406fb9 100644 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.ts +++ b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution.ts @@ -1,40 +1,26 @@ function findRotation(mat: number[][], target: number[][]): boolean { - for (let k = 0; k < 4; k++) { - rotate(mat); - if (isEqual(mat, target)) { - return true; - } - } - return false; -} + const n = mat.length; + let ok = 0b1111; -function isEqual(A: number[][], B: number[][]) { - const n = A.length; for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { - if (A[i][j] !== B[i][j]) { + if (mat[i][j] !== target[i][j]) { + ok &= ~0b0001; + } + if (mat[j][n - 1 - i] !== target[i][j]) { + ok &= ~0b0010; + } + if (mat[n - 1 - i][n - 1 - j] !== target[i][j]) { + ok &= ~0b0100; + } + if (mat[n - 1 - j][i] !== target[i][j]) { + ok &= ~0b1000; + } + if (ok === 0) { return false; } } } - return true; -} -function rotate(matrix: number[][]): void { - const n = matrix.length; - for (let i = 0; i < n >> 1; i++) { - for (let j = 0; j < (n + 1) >> 1; j++) { - [ - matrix[i][j], - matrix[n - 1 - j][i], - matrix[n - 1 - i][n - 1 - j], - matrix[j][n - 1 - i], - ] = [ - matrix[n - 1 - j][i], - matrix[n - 1 - i][n - 1 - j], - matrix[j][n - 1 - i], - matrix[i][j], - ]; - } - } + return ok !== 0; } diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution2.java b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution2.java deleted file mode 100644 index 83fe8fbc2e831..0000000000000 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution2.java +++ /dev/null @@ -1,30 +0,0 @@ -class Solution { - public boolean findRotation(int[][] mat, int[][] target) { - int n = mat.length; - for (int k = 0; k < 4; ++k) { - int[][] g = new int[n][n]; - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { - g[i][j] = mat[j][n - i - 1]; - } - } - if (equals(g, target)) { - return true; - } - mat = g; - } - return false; - } - - private boolean equals(int[][] a, int[][] b) { - int n = a.length; - for (int i = 0; i < n; ++i) { - for (int j = 0; j < n; ++j) { - if (a[i][j] != b[i][j]) { - return false; - } - } - } - return true; - } -} \ No newline at end of file diff --git a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution2.py b/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution2.py deleted file mode 100644 index b9279906c51cc..0000000000000 --- a/solution/1800-1899/1886.Determine Whether Matrix Can Be Obtained By Rotation/Solution2.py +++ /dev/null @@ -1,7 +0,0 @@ -class Solution: - def findRotation(self, mat: List[List[int]], target: List[List[int]]) -> bool: - for _ in range(4): - mat = [list(col) for col in zip(*mat[::-1])] - if mat == target: - return True - return False