leetcode【每日一题】旋转矩阵 Java

题干

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 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]
]

想法

这里用到了一个知识
旋转90度等于让矩阵按轴对称
然后再将每一行反转顺序(也就是按照中心点对称

这里举3 * 3 4 * 4 两个例子使之分别代表奇数偶数

3 * 3
[
[1,2,3],
[4,5,6],
[7,8,9]
]

第一次轴对称以后:
[
[1,4,7],
[2,5,8],
[3,6,9]
]

第二次将每行反转以后
[
[7,4,1],
[8,5,2],
[9,6,3]
]

可以看到旋转成功
偶数个同理

11 12 13 14
15 16 17 18
19 20 21 22
23 24 25 26

第一次:
11 15 19 23
12 16 20 24
13 17 21 25
14 18 22 26

第二次
23 19 15 11
24 20 16 12
25 21 17 13
26 22 18 14

那么代码实现是一样的
注意要求原地旋转,那么第二步就不要直接reverse了
找到重点手动对称就好

Java代码

package daily;



public class Rotate {
    public void rotate(int[][] matrix) {
     int n=matrix.length;
     //先轴对称
     for (int i=0;i<n-1;i++){
         for (int j=i+1;j<n;j++){
             int tem=matrix[i][j];
             matrix[i][j]=matrix[j][i];
             matrix[j][i]=tem;
         }
     }
     int mid=n/2;
     //再每行以中点对称

     for (int i=0;i<n;i++){
         for (int j=0;j<mid;j++){
             int res=matrix[i][j];
             matrix[i][j]=matrix[i][n-1-j];
             matrix[i][n-1-j]=res;
         }
     }

    }
    public  static  void main(String[] args) {
        Rotate rotate = new Rotate();
        int[][] test = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        int[][]test2={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        int[][] test3={{1,2},{3,4}};
        rotate.rotate(test3);
        for (int[] ints : test3) {
            for (int num : ints
            ) {
                System.out.print(num);
            }
            System.out.println();
        }
    }
}

我的leetcode代码也都上传到我的git

发布了180 篇原创文章 · 获赞 0 · 访问量 3769

猜你喜欢

转载自blog.csdn.net/qq_43491066/article/details/105358382
今日推荐