LeetCode 48.旋转图像

题目:

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

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

思路:

笔者粗略画了一个4X4的例子图,可以把每种颜色的数字当作一个小整体,他们各自都按照顺时针箭头的方向旋转。以蓝色部分数字2作为基准,假设数字2所在的位置为matrix[row][col],那么旋转90度之后就到了绿色部分位置8,该数字的行号基准数字2的列号列号矩阵长度-基准数字2的差,因此8的索引位置为matrix[col][matrix.length - row - 1]

同理可得,绿色部分8会旋转到粉色部分的数字15,该位置相当于基准数字2旋转了180度,行号和列号都是相对的,观察即可看出粉色部分的数字15的位置索引为matrix[matrix.length - row - 1][matrix.length - col - 1

再次旋转就会转到黄色部分的数字9,该数字的索引位置为matrix[matrix.length - col - 1][row]
转换解释
知道了数字是怎么反转之后,就剩下写代码了,但要保证原地反转,就要避免出现数字覆盖,可以先设置一个临时变量temp来存储每一次的蓝色部分的基准值,然后倒着赋值防止数字覆盖,总的来说就是黄色部分对应值->蓝色部分对应值粉色部分对应值->黄色部分对应值绿色部分对应值->粉色部分对应值,,最后将存储在临时变量temp中的值赋值给绿色部分对应值完成一次数值旋转

以下为代码+注释:

	public void rotate(int[][] matrix) {
        // 原地反转
        int len = matrix.length;
        for(int row = 0; row < len / 2; row++){
            // 列多+1,如果长度为偶数的话向下取整和原来相同
            // 如果为奇数就多向后遍历一个
            for(int col = 0; col < (len + 1) / 2; col++){
                int temp = matrix[row][col];
                matrix[row][col] = matrix[len - col - 1][row];
                matrix[len - col - 1][row] = matrix[len - row - 1][len - col - 1];
                matrix[len - row - 1][len - col - 1] = matrix[col][len - row - 1];
                matrix[col][len - row - 1] = temp;
            }
        }
    }

笔者也在不断学习,如有错误,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值