旋转图像 及其解答

给定一个 n × n 的二维矩阵表示一个图像。

将图像顺时针旋转 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]
]

思路如下

首先要通过演算推出赋值公式,我的草稿如下
在这里插入图片描述

每一步就是把 matrix[x][y] 赋值给 matrix[y][n-1-x],之后就好说了。

预定义变量有这么几个
x , y 是矩阵的座标,first用来指示x每次循环的起始点,temp用来记录每次会被覆盖的值(每循环一次就会递归四次,交换四个点位,用temp记录将要被覆盖但是下次递归需要的那个点位的值),number用来计数(每次循环递归只执行四次),n表示矩阵每一行的长度。
每次循环交换四个点位,每判断一次while就交换完每一圈的值,所以while的条件是 y<n/2 ,每次递归前把number置零,并用temp记录第一个交换的点位,用于给下个点位赋值。
在递归 change方法中先判断执行次数不大于四次(等于四次则说明每次for循环的四个点位已经交换完毕,就结束本次递归),之后就是先记录matrix[y][n-1-x] 的值用于下次交换,然后把之前记录的 matrix[x][y]的值赋值给 matrix[y][n-1-x]。
就这么简单

在这里插入图片描述

class Solution {
    public void rotate(int[][] matrix) {
        int x =0,y=0,temp=0,number = 0,n = matrix.length;
        while(y<(n>>1)){
            for(x = y;x<n-1-y;x++){
                number = 0;
                temp = matrix[x][y];
                change(x,y,matrix,temp,n,number);
            }
            y++;
        }
    }

    private void change(int x,int y,int[][] matrix,int temp,int n,int number){
        if(number++==4)return;
        int tmp = matrix[y][n-1-x];
        matrix[y][n-1-x] = temp;
        change(y,n-1-x,matrix,tmp,n,number);
    } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章