leetcode48. 旋转图像

方法1:原地旋转

class Solution {
    public void rotate(int[][] matrix) {
        /*
            单独写一下数组中元素的原位置以及旋转之后的位置可以发现这样一个规律:
                (i,j)位置的元素最终的位置是(j,n-i);这里n是matrix.length-1;
            这样进行多次操作如下:
                (i,j)->(j,n-i)->(n-i,n-j)->(n-j,i)->(i,j)
            可以发现,再进行多次将单个数的“旋转”(放到了旋转后的位置)就回到了原来的位置
            可以将矩阵分成四个部分:
                                  1 | 2
                                  3 | 4
            (i,j)在1位置,(j,n-i)在2位置,(n-i,n-j)在4位置,(n-j,i)在3位置
            因此可以直接遍历1中的所有元素,每个元素都进行“一轮”交换,就能得到最终的结果
        */ 
        int n = matrix.length - 1;
        int temp;
        for(int i = 0;i < matrix.length / 2;i++){
            for(int j = 0;j < (matrix.length + 1) / 2;j++){
                temp = matrix[i][j];
                matrix[i][j] = matrix[n-j][i];
                matrix[n-j][i] = matrix[n-i][n-j];
                matrix[n-i][n-j] = matrix[j][n-i];
                matrix[j][n-i] = temp;
            }
        }
 
    }

方法2:矩阵翻转

class Solution {

    public void exchange(int[][] matrix,int i,int j,int tarI,int tarJ){
        int temp = matrix[i][j];
        matrix[i][j] = matrix[tarI][tarJ];
        matrix[tarI][tarJ] = temp;
    }

    public void rotate(int[][] matrix) {
        /**

            每个元素最后的位置为(i,j) -> (j,n-i) ;这里n是matrix.length-1
            想办法看能不能进行多次翻转操作得到结果。
            常用的翻转:1.水平翻转:(i,j)->(n-i,j) 2.左右翻转:(i,j)->(i,n-j)
                      3.对角线翻转:(i,j)->(j,i) 4.反对角线翻转:(i,j)->(n-j,n-i)
            可以有很多种组合得到需要的结果
                这里选择(i,j)水平(n-i,j)对角线(j,n-i)
        */
        int n = matrix.length - 1;
        //1.先水平
        for(int i = 0;i < matrix.length / 2;i++){
            for(int j = 0;j < matrix.length;j++)
                exchange(matrix,i,j,n-i,j);
        }
        //2.再对角线
        for(int i = 0;i < matrix.length;i++){
            for(int j = i+1;j < matrix.length;j++)
                exchange(matrix,i,j,j,i);
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值