【LeetCode】48. 旋转图像

旋转图像

题目描述:

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

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

示例 2:

输入: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

方法一思路分析:

使用辅助数组,观察下图中的旋转规律

可以得出:矩形处于n行m列的元素在旋转后成为第m行的倒数n列的元素。

即由矩阵中的行列从 0 开始计数,因此对于矩阵中的元素 matrix[row][col],在旋转后,它的新位置为nums[col][n−row−1]。

代码实现:

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

方法二思路分析:

  1. 确定旋转的层数
    由于矩阵是方阵(即行数和列数相等)。因此,我们只需要旋转矩阵的n/2层(n是矩阵的边长)

  2. 确定每一层需要旋转的元素
    在每一层中,我们不需要旋转所有的元素,因为矩阵是对称的。我们只需要旋转每一层的“上半部分”(不包括对角线),然后对角线元素(如果有的话)会自然地处于正确的位置。因此,对于每一层,我们只需要处理(n + 1) / 2列(或行,因为它们是等价的)。

  3. 顺时针旋转元素
    对于每一层中的每个元素,我们按照顺时针方向进行旋转。具体来说,我们首先将当前元素(matrix[i][j])的值保存在一个临时变量temp中,然后依次将元素移动到它们顺时针旋转后的位置。最后,将temp(即原始当前元素的值)放到它顺时针旋转后的最终位置(即上方位置)。

  4. 执行循环
    通过嵌套循环遍历每一层和每一层中的元素,并执行上述的旋转操作。

代码实现:

class Solution {  
    public void rotate(int[][] matrix) {  
        int n = matrix.length; // 获取矩阵的边长(假设矩阵是方阵)  
  
        // 外层循环控制要旋转的层数,只需旋转n/2层  
        for (int i = 0; i < n / 2; ++i) {  
            // 内层循环控制每一层中需要旋转的列数(注意,由于是对称旋转,所以只处理一半即可)  
            // (n + 1) / 2 是因为当n为奇数时,中间的行/列只会被遍历一次  
            for (int j = 0; j < (n + 1) / 2; ++j) {  
                // 使用一个临时变量temp来保存当前位置(左上)的值  
                int temp = matrix[i][j];  
  
                // 按顺时针方向,依次将右上、右下、左下三个位置的值移动到当前位置(左上)  
                // 1. 将左下方位置的值移动到左上位置  
                matrix[i][j] = matrix[n - j - 1][i];  
                // 2. 将右下方位置的值移动到刚才左下方位置  
                matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];  
                // 3. 将右上方位置的值移动到刚才右下方位置  
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];  
                // 4. 将temp(即原左上位置的值)移动到刚才右上方位置  
                matrix[j][n - i - 1] = temp;  
            }  
        }  
    }  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值