leetcode--rotate_image

33 篇文章 0 订阅
27 篇文章 0 订阅

leetcode–rotate_image

题意: 给定一个n×n的二维矩阵,将它沿顺时针方向旋转90度
条件: 不引入额外的空间

分析: 本题考察二维数组索引的操作,采用的基本思想是先转置外圈,后转置内圈,从外向内转置,把问题简化。

                                                 

红颜色的是外圈,绿颜色的是内圈,先将外圈全部转置完。(0,0)放到(0,3)的位置,(0,3)放到(3,3)的位置,(3,3)放到(3,0)的位置,(3,0)放到(0,0)的位置,这四步加起来是一次执行;第二次执行从(0,1)开始,放到(1,3)的位置……;第三次执行从(0,2)开始……。第三次执行完之后,外圈全部转置,然后再从内圈开始执行。
为此需要定义3个变量i, j, k。i表示每一圈的最大索引,初始值为n - 1,执行完一圈之后 i ;k表示每一圈的最小索引,初始值为0,执行完一圈之后 k++ ;j用于在每一圈中从k到i遍历转置, j=[k,i1] 。每一次执行的第一步将 (k,j) 放到 (j,i) 的位置,第二步 (j,i) 放到 (i,i+kj) 的位置,第三步将 (i,i+kj) 放到 (i+kj,k) 的位置,第四步将 (i+kj,k) 放到 (k,j) 的位置。执行完四步之后 j++ ,再次循环,终止条件是 ki

代码

public void rotate(int[][] matrix){
        if(matrix == null || matrix.length == 1){
            return;
        }else{
            int n = matrix.length;      //n*n的矩阵,n表示大小
            int i = n - 1;              //数组的最后一个位置
            int k = 0;
            while(k < i){
                for(int j = k; j < i; j++){                 //for循环内是一次执行,i,k在一次执行中不变
                    int temp1 = matrix[j][i];
                    matrix[j][i] = matrix[k][j];            //(k, j)放到(j, i)的位置
                    int temp2 = matrix[i][i + k - j];
                    matrix[i][i + k - j] = temp1;           //(j, i)放到(i, i+k-j)的位置
                    temp1 = matrix[i + k - j][k];
                    matrix[i + k - j][k] = temp2;           //(i, i+k-j)放到(i+k-j, k)的位置
                    matrix[k][j] = temp1;                   //(i+k-j, k)放到(k,j)的位置
                }
                k++;
                i--;
            }
        }
    }

源程序下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值