Leetcode48 Rotate Image

原题:

英:
You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up:
Could you do this in-place?
中:
给定一个n×n的二维矩阵表示一个图像。
将图像旋转90度(顺时针)。
跟进:你能做到这一点吗?


解题思路:

这道题看起来在说图像旋转的问题,其实就是矩阵旋转的问题。

第一种是蛮力旋转的方法,如下所示:
1 2 3      7 4 1    A[0][0]->A[0][2] A[0][1]->A[1][2] A[0][2]->A[2][2]
4 5 6  --> 8 5 2    A[1][0]->A[0][1] A[1][1]->A[1][1] A[1][2]->A[2][1]
7 8 9      9 6 3    A[2][0]->A[0][0] A[2][1]->A[1][0] A[2][2]->A[2][0]

由此,对于n纬矩阵,总结规律为: A[i][j] -> A[j][n-1-i]

代码如下:

public class Solution {
    public void rotate(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;//其实row和col的值是一样的
        int[][] res = new int[row][col];
        for(int i=0; i<row;i++){
            for(int j=0;j<col;j++){
                res[j][col-1-i] = matrix[i][j];
            }
        }
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                matrix[i][j] = res[i][j];
            }
        }
    }
}
第二种方法是用四个点进行旋转,从外围到里面,如下图所示:
1 2 3           7 2 1           7 4 1
4 5 6    -->    4 5 6    -->    8 5 2
7 8 9           9 8 3           9 6 3

① A[0][0]->A[0][2],A[2][0]->A[0][0],A[2][2]->A[2][0],A[0][2]->A[2][2]

② A[0][1]->A[1][2],A[1][0]->A[0][1],A[2][1]->A[1][0],A[1][2]->A[2][1]

代码如下:

public class Solution {
    public void rotate(int[][] matrix){
        int n = matrix.length;
        for(int i=0; i<n/2; i++){
            for(int j=i; j<n-1-i; j++){//从i开始取值,小于n-1-i终止,表示内层坐标
                int tmp = matrix[j][n-1-i];//临时变量
                matrix[j][n-1-i] = matrix[i][j];
                matrix[i][j] = matrix[n-1-j][i];
                matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
                matrix[n-1-i][n-1-j] = tmp;
            }
        }
    }
}

重点说明:

第一种方法虽然也能通过,但是与题意有些差别,属于投机取巧的做法。
第二种方法符合题意,但是在坐标之间的转换时要注意。而且,在for循环中i和j的取值范围也要注意。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值