算法题:旋转矩阵

方法一:使用新数组。

首先我们需要对题目进行分析,在二维数组进行90°旋转后他们的位置是怎么样的。

我们以下图为例

在他进行90°旋转后我们可以得到以下的结果。

 第一行的第 x 个元素在旋转后恰好是倒数第一列的第 x 个元素。

 

 对于第二行来说,矩阵中的第x行的第y个元素,他变化后的位置就是  第y行的倒数第i列。

我们把上面的话翻译成公式就是: matrix[x] [y],旋转后变成matrix[y] [n-1-x]。那么下面我们看代码

 public void rotate(int[][] matrix) {
//获取数组长度因为数组是矩形所以不需要处理(长宽一致)。
        int n = matrix.length;
//创建新的数组用来容纳变化后的矩阵
        int[][] matrix_new = new int[n][n];
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {

                //将旧的位置的数填入新数组的相应的位置。
                matrix_new[j][n - i - 1] = matrix[i][j];
            }
        }
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {

                //最后填充
                matrix[i][j] = matrix_new[i][j];
            }
        }
    }

上面这种方法使用了额外的内存,下面我们使用翻转代替旋转

方法二:翻转代替旋转

还是使用这个数组作为例子

下面我们通过水平翻转得到如下数组

再进行对角线翻转

 反转后我们就得到了旋转后的矩阵

对于水平轴翻转而言,我们只需要枚举矩阵上半部分的元素,和下半部分的元素进行交换,即列不变交换行位置:

matrix[x] [y] ================》matrix[n-1-x] [y]

对于主对角线翻转而言,我们只需要枚举对角线左侧的元素,和右侧的元素进行交换,即交换行和列:

matrix[x] [y] ================》matrix[y] [x]

将它们组合在一起,进行联立即可得到:

matrix[x] [y] ================》matrix[n-1-x] [y]============》matrix[y] [n-1-x]

进行简化:

matrix[x] [y] ================》matrix[y] [n-1-x]

下面我们来看代码:

public void rotate(int[][] matrix) {
        int n = matrix.length;
        // 进行水平翻转,n/2可以控制翻转。
        for (int i = 0; i < n / 2; ++i) {
            for (int j = 0; j < n; ++j) {
                //使用temp 进行数值保存
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - i - 1][j];
                matrix[n - i - 1][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;
            }
        }
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值