「 数据结构与算法 」旋转矩阵

71 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情


题目

给你一幅由 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
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();
        }
    }
}

本篇内容参考自开源社区,已收录至 《菜鸟程序员成长计划》之数据结构与算法 专栏,更多、更体系化的内容请持续关注,您的 关注、点赞、收藏 都将是小编持续创作的动力!感谢前人的经验和付出,让我们可以有机会站在巨人的肩膀上眺望星辰大海。


开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情