1.问题描述
  给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例1

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]
示例2

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]] 输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
提示
n == matrix.length == matrix[i].length1 <= n <= 20-1000 <= matrix[i][j] <= 1000
难度等级
中等
题目链接
旋转图像
2.解题思路
这道旋转图像的题,只要找到其中的规律,做起来十分简单。我们不难发现,这里的旋转,就是将数顺时针的转一圈,而且我们还可以发现,一个4*4的矩阵,如果将最外一层顺时针旋转一圈,我们就可以将选择一个4*4的矩阵问题,变成一个旋转3*3的矩阵问题。也就是说,我们每旋转一圈,需要旋转的矩阵就会变小,直到变成一个1*1的矩阵,无法再旋转,问题就解决了。
所以,解决这道题的关键,就是如何顺时针旋转最外层的数。这个问题也不能解决,我们可以把它分成四部分,把下面移到左边、左边移到上边、上边移到右边,右边移到下边四个部分。
我们可以定义一个layer变量来记录已经旋转的层数,我们一共要旋转n / 2层。我们每旋转一层,下一层需要旋转的个数就减少2个。
        //层数
        int layer = 0;
        while(layer < matrix.length / 2){
            //每次转移的个数
            int nums = matrix.length-1-2*layer;
            ......
} 
我们要将四个方向的数进行旋转,首先得创建一个临时数据来存储其中一个方向的数,相当于把一边拆出来,然后将其它三边转一圈,然后再把拆出来的那一边安装回去。
            //创建一个临时数组
        int[] temp = new int[nums];
        //初始化临时数组(存上)
        for(int i = 0;i < nums;i++){
            temp[i] = matrix[layer][i+layer];
            
        } 
我们可以就像拼积木一样,将左边的积木移动到上边。
        //左->上
        for(int i = 0;i < nums;i++){
            matrix[layer][i+layer] = matrix[matrix.length-1-i-layer][layer];
        } 
再将下边的积木移动到左边。
        //下->左
        for(int i = 0;i < nums;i++){
            matrix[matrix.length - 1 -i -layer][layer] = matrix[matrix.length-1-layer][matrix.length-1-i - layer];
        } 
再将右边的积木移动到下边。
        //右到下
        for(int i = 0;i < nums;i++){
            matrix[matrix.length-1-layer][matrix.length-1-i-layer] = matrix[i+layer][matrix.length-1-layer];
        } 
最后再将存在临时数组中的积木(上边的)安装会右边。
        //上到右
        for(int i = 0;i < nums;i++){
            matrix[i+layer][matrix.length-1-layer] = temp[i];
        } 
我们移动完一圈的积木之后,就将层数加1,变成旋转(n-1)*(n-1)的矩阵的问题。
        //层数增加
        layer++; 
3.代码展示
class Solution {
    public void rotate(int[][] matrix) {
        //层数
        int layer = 0;
        while(layer < matrix.length / 2){
            //每次转移的个数
            int nums = matrix.length-1-2*layer;
            //创建一个临时数组
        int[] temp = new int[nums];
        //初始化临时数组(存上)
        for(int i = 0;i < nums;i++){
            temp[i] = matrix[layer][i+layer];
            
        }
        //左->上
        for(int i = 0;i < nums;i++){
            matrix[layer][i+layer] = matrix[matrix.length-1-i-layer][layer];
        }
        //下->左
        for(int i = 0;i < nums;i++){
            matrix[matrix.length - 1 -i -layer][layer] = matrix[matrix.length-1-layer][matrix.length-1-i - layer];
        }
        //右到下
        for(int i = 0;i < nums;i++){
            matrix[matrix.length-1-layer][matrix.length-1-i-layer] = matrix[i+layer][matrix.length-1-layer];
        }
        //上到右
        for(int i = 0;i < nums;i++){
            matrix[i+layer][matrix.length-1-layer] = temp[i];
        }
        //层数增加
        layer++;
        }
    }
} 
4.总结
这道题其实很简单,就是不断的旋转外圈,不断的缩小矩阵,直到变成一个1*1的矩阵,问题就解决了。好了,这道题就讲到这里了,祝大家刷题愉快~



















