博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数组和矩阵问题:将正方形矩阵顺时针转动90度
阅读量:6534 次
发布时间:2019-06-24

本文共 2373 字,大约阅读时间需要 7 分钟。

题目

  给定一个 N*N 的矩阵 matrix, 把这个矩阵调整成顺时针转动90度后形式。

  例如:

  1    2    3    4

  5    6    7    8

  9    10  11  12

  13  14  15  16

  顺时针转动90度后为:

  13  9    5    1

  14  10  6    2

  15  11  7    3 

  16  12  8    4

要求

  额外空间复杂度为 O(1)

难度

  一星

解答

  这里仍然使用分圈处理的方式,在矩阵中用左上角的坐标(tR, tC)和右下角的坐标(dR, dC) 就可以表示一个子矩阵。比如,题目中的矩阵,当(tR, tC)=(0,0), (dR,dC)=(3,3) 时,表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下:

  1   2   3  4

  5            8

  9                 12

  13     14     15    16

  在这个外圈中, 1,4,16,13 为一组,然后让1占据4的位置,4占据16的位置,16占据13的位置,13占据1的位置,一组就调整完了。然后,2,8,15,9 为一组,继续占据调整的过程,最后 3,12,14,5 为一组,继续占据调整的过程。然后(tR, tC)=(0,0)、(dR,dC)=(3,3) 的子矩阵外层就调整完毕了。接下来令tR和tC加1,dR和dC减1,即(tR,tC)=(1,1), (dR, dC)=(2,2), 此时表示的子矩阵如下:

  6    7

  10  11

  这个外层只有一组,就是6,7,11,10,占据调整之后即可。所以,如果子矩阵的大小是M*M,一共就有 M-1 组, 分别进行占据调整即可。

  具体过程请参看如下代码的 rotate 方法。

1 public class Main { 2      3     public static void main(String[] args) { 4         int[][] matrix = {
{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; 5 System.out.println("原矩阵:"); 6 for(int i = 0; i < matrix.length; i++){ 7 for(int j = 0; j < matrix[i].length; j++){ 8 System.out.print(matrix[i][j] + " "); 9 }10 System.out.println();11 }12 13 new Main().rotate(matrix);14 System.out.println("\n顺时针旋转90度后:");15 for(int i = 0; i < matrix.length; i++){16 for(int j = 0; j < matrix[i].length; j++){17 System.out.print(matrix[i][j] + " ");18 }19 System.out.println();20 }21 }22 23 //顺时针旋转90度24 public void rotate(int[][] matrix){25 int tR = 0;26 int tC = 0;27 int dR = matrix.length - 1;28 int dC = matrix[0].length - 1;29 while(tR <= dR && tC <= dC){30 rotateEdge(matrix, tR++, tC++, dR--, dC--);31 }32 }33 34 //旋转子矩阵外层35 public void rotateEdge(int[][] m, int tR, int tC, int dR, int dC){36 //确定旋转次数37 int times = dR - tR;38 for(int i = 0; i < times; i++){39 //要交换的四个位置按顺时针方向分别为:m[tR][tC+i]、m[tR+i][dC]、m[dR][dC-i]、m[dR-i][tC]40 int tmp = m[tR][tC+i];41 m[tR][tC+i] = m[dR-i][tC];42 m[dR-i][tC] = m[dR][dC-i];43 m[dR][dC-i] = m[tR+i][dC];44 m[tR+i][dC] = tmp;45 }46 }47 48 }

 

转载于:https://www.cnblogs.com/zlxyt/p/10514666.html

你可能感兴趣的文章
2017中国系统架构师大会“盛装”来袭
查看>>
Google插件switchysharp的用法
查看>>
中国最强的人工智能学术会议来了
查看>>
Metasploit的射频收发器功能 | Metasploit’s RF Transceiver Capabilities
查看>>
Osmocom-BB中cell_log的多种使用姿势
查看>>
主库 归档 删除策略
查看>>
linux服务器多网卡bond
查看>>
Chrome 更新策略大变:优先安装 64 位版本
查看>>
《Linux从入门到精通(第2版)》——导读
查看>>
路过下载攻击利用旧版 Android 漏洞安装勒索软件
查看>>
ThinkSNS 六大子版本体验及源码下载
查看>>
《算法基础》——1.5实际因素
查看>>
《Java数字图像处理:编程技巧与应用实践》——第3章 基本Swing UI组件与图像显示 3.1 JPanel组件与BufferedImage对象的显示...
查看>>
为什么有人讨厌 Google 的新 Logo?
查看>>
2022 年 AI 会发展成什么样子,IBM 做出了 5 大预测
查看>>
腾讯2017暑期实习编程题3
查看>>
整理收藏一份PHP高级工程师的笔试题
查看>>
Intellij IDEA 构建Spring Web项目 — 用户登录功能
查看>>
[AHOI2013]作业
查看>>
[bzoj 4241]历史研究
查看>>