自学内容网 自学内容网

【Leetcode Top 100】48. 旋转图像

问题背景

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

数据约束

  • n = = m a t r i x . l e n g t h = = m a t r i x [ i ] . l e n g t h n == matrix.length == matrix[i].length n==matrix.length==matrix[i].length
  • 1 ≤ n ≤ 20 1 \le n \le 20 1n20
  • − 1000 ≤ m a t r i x [ i ] [ j ] ≤ 1000 -1000 \le matrix[i][j] \le 1000 1000matrix[i][j]1000

解题过程

比较好想的做法是定义一个辅助矩阵,将对应行排列到相应的列中,再把所有元素覆盖回来。这样的做法需要 O ( N ) O(N) O(N) 的额外空间,就不写了。

另一个解决旋转问题的思路是将旋转拆解为多个翻转,本题中可以将顺时针旋转 90 90 90 度拆解为矩阵上下翻转和沿着主对角线翻转两个操作。这样的想法问题在于,面对第一次见到的问题,不一定能快速地找到拆解的方案,需要平时多积累。

还可以直接移动元素,需要注意的是当矩阵的阶数为奇数时,需要考察的范围是一个矩形。考虑到这种情况,需要将行或者列的循环结束条件修正为 i ( j ) < ( n + 1 ) / 2 i(j) < (n + 1) / 2 i(j)<(n+1)/2

具体实现

翻转矩阵

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for(int i = 0; i < n / 2; i++) {
            for(int j = 0; j < n; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - i][j];
                matrix[n - 1 - i][j] = temp;
            }
        }
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < i; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
    }
}

移动元素

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for(int i = 0; i < n / 2; i++) {
            for(int j = 0; j < (n + 1) / 2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - j][i];
                matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
                matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
                matrix[j][n - 1 - i] = temp;
            }
        }
    }
}

原文地址:https://blog.csdn.net/2401_88859777/article/details/143986899

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!