问题:

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:
Could you do this in-place?

分析:

二维数组a[n][n]顺时针旋转90度,要解决这个问题,无疑,第一件事儿就是找规律。

当n=1时,不用动了。

当n=2时,

旋转之后变为

有:

a[0][0] = a[1][0]

a[1][0] = a[1][1]

a[1][1] = a[0][1]

a[0][1] = a[0][0]

在这里我们初步总结规律为:a[i][j] = a[n-1-j][i]

当n=3时,

旋转后变为

显然是满足上面的规律的

当n=4,5,……时也是满足的。

到这里,如果不考虑空间复杂的度的话,我们已经可以解决这个问题了,只需要再构建一个二维数组b[n][n],利用公式b[i][j] = a[n-1-j][i],就ok了,代码如下:

public void rotate(int[][] matrix) {int n = matrix.length;int[][] m = new int[n][n];for(int row=0;row<n;row++){for(int col=0;col<n;col++){m[row][col] = matrix[n-1-col][row];}}//再赋值回matrix,注意java是形参是引用传递for(int row=0;row<n;row++){for(int col=0;col<n;col++){matrix[row][col] = m[row][col];}}}

但是在这里,题目中也要求了,就在原数组中,应该怎么旋转?

接着上面的分析,以n=3为例:

旋转后变为

我们把焦点放在一个元素的旋转上,可以看出要在员数组中旋转,在不丢失数据的情况下,每个值的要旋转会“波及”4个数,以1为例波及到了1,3,7,9,每个数旋转要不丢失数据就要考虑如何让这个4个数都得以保留

前边总结了规律a[i][j] = a[n-1-j][i],分析每组被波及的数,我们可以得出这里波及的4了数其实就是

a[i][j]

a[n-1-j][i]

a[n-1-i][n-1-j]

a[n-1-(n-1-j)][n-1-i]=a[j][n-1-i]

所以这里需要引入一个临时变量temp就可以解决这4个数的顺时针交换,如:

int temp = matrix[i][j];
matrix[i][j] = matrix[n-1-j][i];
matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
matrix[j][n-1-i] = temp;

把焦点放在一个元素上,数交换的问题解决了,

那么现在我们把焦点回到整个二维数组上来,每个数的旋转会波及4个数,相当于用上面的方法,每旋转一个数,就把一组的4个数都旋转了,

所以现在的问题就是如何才能完整的把所有的数都旋转90度且不会多旋转,继续分析吧,

n=1时,不需旋转。

n=2时,

只需要完成1(a[0][0])的旋转,就完成了整个数组的旋转。

n=3时,

需要完成1,2(a[0][0],a[0][1])的旋转,就完成了整个数组的旋转

n=4时,

需要完成1,2,3,6(a[0][0至3],a[1][1])的旋转

n=5时,

需要完成(a[0][0至4],a[1][1至2])

大致可以总结出这么一个规律:

对于要旋转的数a[i][j]满足,

i<n/2

i<=j<n-1-i

至此问题终于完美解决了。。

代码如下:

public class Solution {public void rotate(int[][] matrix) {int n = matrix.length;int limit = (n-1)/2;for(int i=0;i<= limit; i++){for(int j=i;j<n-1-i;j++){int temp = matrix[i][j];matrix[i][j] = matrix[n-1-j][i];matrix[n-1-j][i] = matrix[n-1-i][n-1-j];matrix[n-1-i][n-1-j] = matrix[j][n-1-i];matrix[j][n-1-i] = temp;}}}
}

转载于:https://www.cnblogs.com/chrischennx/p/4009376.html

LeetCode——Rotate Image(二维数组顺时针旋转90度)相关推荐

  1. 编程题: 将一个矩阵(二维数组)顺时针旋转90度

    在一个m*n的矩阵任取一个元素(i, j),发现旋转后对应的元素下标变成:(j, m-i). 进一步研究一下矩阵的各种翻转可知: 沿左上到右下的对角线翻转:(i, j)与(j, i)对换; 沿右上到左 ...

  2. 二维数组旋转90度、180度、270度

    图像处理中,很多时候要使用到二维数组的旋转.本质上二维数组的旋转其实就是坐标的变换,即旋转后的坐标(x,y)需要对应到原有二维数组的坐标点上,取到正确的值即可完成正确的旋转. 规则很好找.见如下的代码 ...

  3. c语言数组顺时针旋转90度,算法:数组顺时针、逆时针90度旋转

    以九度oj1171为例: 首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据. 操作类型有四种: 1 2 表示: ...

  4. python顺时针旋转_Python之二维数组N*N顺时针旋转90度

    需求:把一个二维数组顺时针旋转90度,现实数据的替换. 比如把4*4的二维数组顺时针旋转90度 原始数据是一个嵌套列表:[['A', 'B', 'C', 'D'], ['A', 'B', 'C', ' ...

  5. 二维数组的花式遍历技巧盘点

    学算法认准 labuladong 后台回复 进群 进刷题 读完本文,可以去力扣解决如下题目: 48. 旋转图像(中等) 54. 螺旋矩阵(中等) 59. 螺旋矩阵 II(中等) 有不少读者说,看过很多 ...

  6. python将矩阵顺时针旋转90度_python 二维数组90度旋转的方法

    如下所示: #!/usr/bin/env python #-*- coding: utf-8 -*- """ [0, 1, 2, 3] [0, 1, 2, 3] [0, ...

  7. 二维数组横向和纵向遍历的巨大差距:缺页问题

    缺页问题 缺页是引入了虚拟内存后的一个概念.操作系统启动后,在内存中维护着一个虚拟地址表,进程需要的虚拟地址在虚拟地址表中记录.一个程序被加载运行时,只是加载了很少的一部分到内存,另外一部分在需要时再 ...

  8. java交换二维数组行列_java二维数组行列

    培训系列AmberXie 求二维数组行列之和把二维数组 a 各行之和分别放入 b... 二维数组例题答案[技巧] [例 1]编写程序,利用二维数组在窗体上输出如图 5x5...如果没有 max 为行列 ...

  9. Python 对称矩阵顺时针旋转90度

    方式一:这种方法是从右下角至上开始读取,然后依次向左读取,但是时间复杂度过高,建议看方式二 # 把对称矩阵顺时针旋转90度 # 该法问从左下角往上读取,再重新构造矩阵,时间复杂度叫高 matrix = ...

最新文章

  1. GPU—加速数据科学工作流程
  2. Learn OpenGL (五):向量
  3. aaynctask控制多个下载进度_AsyncTask用法解析-下载文件动态更新进度条
  4. the application has stopped unexpected。please try again
  5. linux模块化机制,Linux模块化机制和module_init
  6. Linux中deb软件包管理怎么看,Deb软件包管理
  7. 获取 子文件夹 后缀_CSDN学院第一个Ptython Homework-- 递归统计文件夹大小
  8. mmdetection工程训练文件配置小结
  9. 为什么使用linux内核,为什么Linux内核使用它所做的数据结构?
  10. Failed to start bean ‘documentationPluginsBootstrapper‘;
  11. Hadoop学习之路(二十七)MapReduce的API使用(四)
  12. OSAL工作机制分析
  13. linux安装yarn
  14. java ipv6工具,支持通过IPv6地址和子网大小 计算开始结束地址
  15. Hexo在博客中插入图片
  16. 虚拟现实内容开发收费标准
  17. Tensorflow框架初识
  18. Unity3D游戏开发之在uGUI中使用不规则精灵制作按钮
  19. 财商教育—百万富翁的生活习惯
  20. Excel中日期、数字、中文大写金额等转文本

热门文章

  1. 自动机器学习新进展!性能超过人类调参师6个点,AutoGluon 低调开源
  2. 反正我不信!马斯克谈元宇宙:没人愿意把屏幕贴脸上
  3. 一眼识别这是什么鸟,比人类还厉害的“我们来找茬”十级选手诞生!
  4. 她是直播聊学习成“网红”的北大博士,毕业后入职民办学校,年薪70万
  5. 斯坦福连续发了四年的 AI 报告,今年讲了什么?
  6. 业界首个面向NLP场景深度迁移学习框架
  7. 为什么 Python 没有 main 函数?
  8. 利用蒙特卡罗法,国外老哥成功制造出 100% 投篮命中的篮板!
  9. 国内高校简称撞车史:南大、西大、东大都在争,唯独北大没人抢
  10. 在Linux系统中安装pycharm详解