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

更多、更体系化的内容请持续关注 《菜鸟程序员成长计划》之数据结构与算法 专栏,您的 关注、点赞、收藏 都将是小编持续创作的动力!

题目


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

参考:本篇内容参考自开源社区,感谢前人的经验和付出,让我们可以有机会站在巨人的肩膀上眺望星辰大海。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白吃饱了吗

请博主喝杯咖啡,有力继续码字!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值