矩阵顺时针逆时针旋转90°

在做矩阵旋转90°时,做的是顺时针旋转90°,但是想到了逆时针怎么做呢?这其中牵扯到对角线问题,主对角线好想,但是副对角线,自己还是想了一会儿?
自己原来做的顺时针打印矩阵,用的循环遍历,其实还有一种旋转矩阵的做法。

矩阵顺时针旋转90°

1 2 3                                
4 5 6 
7 8 9     
---第一步:上下颠倒矩阵
7 8 9
4 5 6
1 2 3
---第二步:关于主对角线交换元素
7 4 1
8 5 2
9 6 3                           

代码如下:

class Solution {
    public void rotate(int[][] matrix) {//交换主对角线两边元素
       reverse(matrix);
        for(int i = 0;i<matrix.length;i++){
            for(int j = i+1;j<matrix.length;j++){
                int temp = matrix[i][j];
                matrix[i][j] =matrix[j][i];
                matrix[j][i]=temp;
                
            }
        }
    }
    public void reverse(int[][] matrix){//颠倒矩阵
        int n = matrix.length-1;
        for(int i = 0;i<matrix.length/2;i++){
            for(int j=0;j<matrix[i].length;j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n-i][j];
                matrix[n-i][j]=temp;
            }
        }
    }
}

矩阵逆时针旋转90°

逆时针与顺时针做法步骤一样,都是先上下颠倒矩阵,在对换对角线两边元素,不过
这次是副对角线两边元素。

1 2 3
4 5 6
7 8 9
----第一步:矩阵上下颠倒
7 8 9
4 5 6
1 2 3
-----第二步:交换副对角线两边元素
3 6 9
2 5 8
1 4 7

这关键是找到副对角线两边元素之间的关系:
a[i][j] ---------------a[n-j][n-i]
代码如下:

class Solution {
    public void rotate(int[][] matrix) {//交换主对角线两边元素
       reverse(matrix);
       for(int i = 0;i<array.length;i++) {
			for(int j = 0;j<array.length-i-1;j++) {
				int temp = array[i][j];
				array[i][j] = array[n-j][n-i];
				array[n-j][n-i] = temp;
			}
		}
    }
    public void reverse(int[][] matrix){//颠倒矩阵
        int n = matrix.length-1;
        for(int i = 0;i<matrix.length/2;i++){
            for(int j=0;j<matrix[i].length;j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n-i][j];
                matrix[n-i][j]=temp;
            }
        }
    }
}

顺时针打印矩阵:

1 2 3 
4 5 6
7 8 9
---打印第一行
---逆时针旋转90°
6 9 
5 8
4 7
---打印第一行
---逆时针旋转90°
8 7
5 4
---打印第一行
---逆时针旋转90°
4
5
---打印第一行
---逆时针旋转90°
5
打印第一行

逆时针打印矩阵:

每次顺时针旋转矩阵就行了

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值