[LeetCode] 1886. Determine Whether Matrix Can Be Obtained By Rotation

Given two n x n binary matrices mat and target, return true if it is possible to make mat equal to target by rotating mat in 90-degree increments, or false otherwise.

Example 1:

Input: mat = [[0,1],[1,0]], target = [[1,0],[0,1]]
Output: true
Explanation: We can rotate mat 90 degrees clockwise to make mat equal target.

Example 2:

Input: mat = [[0,1],[1,1]], target = [[1,0],[0,1]]
Output: false
Explanation: It is impossible to make mat equal to target by rotating mat.

Example 3:

Input: mat = [[0,0,0],[0,1,0],[1,1,1]], target = [[1,1,1],[0,1,0],[0,0,0]]
Output: true
Explanation: We can rotate mat 90 degrees clockwise two times to make mat equal target.

Constraints:
n == mat.length == target.length
n == mat[i].length == target[i].length
1 <= n <= 10
mat[i][j] and target[i][j] are either 0 or 1.

判断矩阵经轮转后是否一致。

给你两个大小为 n x n 的二进制矩阵 mat 和 target 。现 以 90 度顺时针轮转 矩阵 mat 中的元素 若干次 ,如果能够使 mat 与 target 一致,返回 true ;否则,返回 false 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/determine-whether-matrix-can-be-obtained-by-rotation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

这道题给了一个小小的提示顺时针旋转90度,可惜我第一次做的时候没有意识到。其实这道题跟 48 题很像。48 题只是请你把 input matrix 顺时针旋转90度;这道题是请你判断 target 是否有可能是通过将 input matrix 顺时针旋转了若干次而得来的。既然48题我们都可以不用额外空间实现,这道题也可以。我们需要把48题的方法照搬过来,只是每次旋转90度之后都要判断一次,一共判断四次即可。同时注意 target matrix 有可能跟原来的 mat 一样,不需要 rotate。

复杂度

时间O(n^2)
空间O(1)

代码

Java实现

class Solution {
    public boolean findRotation(int[][] mat, int[][] target) {
        for (int i = 0; i < 4; i++) {
            int[][] rotated = helper(mat);
            if (isSame(rotated, target)) {
                return true;
            }
        }
        return false;
    }

    private int[][] helper(int[][] matrix) {
        // 按左上 - 右下对角线交换
        int m = matrix.length;
        for (int i = 0; i < m; i++) {
            for (int j = i; j < m; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }

        // 左右对折
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < m / 2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][m - 1 - j];
                matrix[i][m - 1 - j] = temp;
            }
        }
        return matrix;
    }

    private boolean isSame(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;
    }
}

同时我也分享一下第一次做的代码,我是把 rotate 过后的结果 matrix 模拟出来了才判断的。细节很不好想,而且容易错。

class Solution {
    public boolean findRotation(int[][] mat, int[][] target) {
        // corner case
        if (helper(target, mat)) {
            return true;
        }

        // normal case
        int[][] first = rotateOnce(mat);
        int[][] second = rotateTwice(mat);
        int[][] third = rotateThird(mat);
        if (helper(target, first) || helper(target, second) || helper(target, third)) {
            return true;
        }
        return false;
    }

    private boolean helper(int[][] matrix1, int[][] matrix2) {
        for (int i = 0; i < matrix1.length; i++) {
            for (int j = 0; j < matrix1[0].length; j++) {
                if (matrix1[i][j] != matrix2[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }

    // rotate 90
    private int[][] rotateOnce(int[][] mat) {
        int len = mat.length;
        int[][] A = new int[len][len];
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[0].length; j++) {
                A[j][len - 1 - i] = mat[i][j];
            }
        }
        return A;
    }

    // rotate 180
    private int[][] rotateTwice(int[][] mat) {
        int len = mat.length;
        int[][] B = new int[len][len];
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[0].length; j++) {
                B[i][j] = mat[len - 1 - i][len - 1 - j];
            }
        }
        return B;
    }

    // rotate 270
    private int[][] rotateThird(int[][] mat) {
        int len = mat.length;
        int[][] C = new int[len][len];
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[0].length; j++) {
                C[len - 1 - j][i] = mat[i][j];
                // System.out.println("old, i " + i + " j " + j);
                // System.out.println("new, i " + (len - 1 - i) + " j " + (len - 1 - j));
            }
        }
        // for (int i = 0; i < C.length; i++) {
        //     System.out.println(Arrays.toString(C[i]));
        // }
        return C;
    }
}

相关题目

48. Rotate Image
1886. Determine Whether Matrix Can Be Obtained By Rotation
posted @ 2021-06-17 12:53  CNoodle  阅读(346)  评论(0编辑  收藏  举报