侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【脑筋急转弯】旋转图像

GabrielxD
2022-04-17 / 0 评论 / 0 点赞 / 277 阅读 / 1,153 字
温馨提示:
本文最后更新于 2022-10-13,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

48. 旋转图像


给定一个 n×nn \times n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90°90\degree
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

image-20220416222405252

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

image-20220416222412950

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

解题

方法零:辅助空间

思路

违反题目要求,借助辅助空间来旋转数组:

例:

[51911248101336715141216]\begin{bmatrix} 5 & 1 & 9 & 11\\ 2 & 4 & 8 & 10\\ 13 & 3 & 6 & 7\\ 15 & 14 & 12 & 16 \end{bmatrix}

[51911]旋转后[51911]\begin{bmatrix} 5 & 1 & 9 & 11\\ \circ & \circ & \circ & \circ\\ \circ & \circ & \circ & \circ\\ \circ & \circ & \circ & \circ \end{bmatrix} \stackrel{旋转后}{\Longrightarrow} \begin{bmatrix} \circ & \circ & \circ & 5\\ \circ & \circ & \circ & 1\\ \circ & \circ & \circ & 9\\ \circ & \circ & \circ & 11 \end{bmatrix}

[24810]旋转后[24810]\begin{bmatrix} \circ & \circ & \circ & \circ\\ 2 & 4 & 8 & 10\\ \circ & \circ & \circ & \circ\\ \circ & \circ & \circ & \circ \end{bmatrix} \stackrel{旋转后}{\Longrightarrow} \begin{bmatrix} \circ & \circ & 2 & \circ\\ \circ & \circ & 4 & \circ\\ \circ & \circ & 8 & \circ\\ \circ & \circ & 10 & \circ \end{bmatrix}

于是有:matrixnew[col][lenrow1]=matrix[row][col]matrix_{new}[col][len-row-1]=matrix[row][col]

创建一个辅助空间 copy 把原矩阵 matrix 复制一份然后把辅助空间 copy 当作源矩阵按照规则复制到原来的矩阵中。

代码

class Solution {
    public void rotate(int[][] matrix) {
        int len = matrix.length;
        int[][] copy = new int[len][len];
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                copy[i][j] = matrix[i][j];
            }
        }
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                matrix[j][len - 1 - i] = copy[i][j];
            }
        }
    }
}

方法一:翻转

思路

把矩阵先水平翻转,再对角线翻转

例:

[51911248101336715141216]水平翻转[15141216133672481051911]沿对角线翻转[15132514341126891671011]\begin{bmatrix} 5 & 1 & 9 & 11\\ 2 & 4 & 8 & 10\\ 13 & 3 & 6 & 7\\ 15 & 14 & 12 & 16 \end{bmatrix} \stackrel{水平翻转}{\Longrightarrow} \begin{bmatrix} 15 & 14 & 12 & 16\\ 13 & 3 & 6 & 7\\ 2 & 4 & 8 & 10\\ 5 & 1 & 9 & 11 \end{bmatrix} \stackrel{沿对角线翻转}{\Longrightarrow} \begin{bmatrix} 15 & 13 & 2 & 5\\ 14 & 3 & 4 & 1\\ 12 & 6 & 8 & 9\\ 16 & 7 & 10 & 11 \end{bmatrix}

翻转只需要操作半与另一半交换。

代码

class Solution {
    public void rotate(int[][] matrix) {
        int len = matrix.length;
        // 水平翻转
        for (int row = 0; row < (len >> 1); row++) {
            for (int col = 0; col < len; col++) {
                swap(matrix, len - 1 - row, col, row, col);
            }
        }
        // 对角线翻转
        for (int row = 0; row < len ; row++) {
            for (int col = 0; col < row; col++) {
                swap(matrix, row, col, col, row);
            }
        }
    }

    public void swap(int[][] matrix, int row1, int col1, int row2, int col2) {
        int tmp = matrix[row1][col1];
        matrix[row1][col1] = matrix[row2][col2];
        matrix[row2][col2] = tmp;
    }
}
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < i; ++j) swap(matrix[i][j], matrix[j][i]);
        }
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n / 2; ++j) swap(matrix[i][j], matrix[i][n - j - 1]); 
        }
    }
};
0

评论区