LeetCode——Rotate Image(二维数组顺时针旋转90度)
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度)相关推荐
- 编程题: 将一个矩阵(二维数组)顺时针旋转90度
在一个m*n的矩阵任取一个元素(i, j),发现旋转后对应的元素下标变成:(j, m-i). 进一步研究一下矩阵的各种翻转可知: 沿左上到右下的对角线翻转:(i, j)与(j, i)对换; 沿右上到左 ...
- 二维数组旋转90度、180度、270度
图像处理中,很多时候要使用到二维数组的旋转.本质上二维数组的旋转其实就是坐标的变换,即旋转后的坐标(x,y)需要对应到原有二维数组的坐标点上,取到正确的值即可完成正确的旋转. 规则很好找.见如下的代码 ...
- c语言数组顺时针旋转90度,算法:数组顺时针、逆时针90度旋转
以九度oj1171为例: 首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据. 操作类型有四种: 1 2 表示: ...
- python顺时针旋转_Python之二维数组N*N顺时针旋转90度
需求:把一个二维数组顺时针旋转90度,现实数据的替换. 比如把4*4的二维数组顺时针旋转90度 原始数据是一个嵌套列表:[['A', 'B', 'C', 'D'], ['A', 'B', 'C', ' ...
- 二维数组的花式遍历技巧盘点
学算法认准 labuladong 后台回复 进群 进刷题 读完本文,可以去力扣解决如下题目: 48. 旋转图像(中等) 54. 螺旋矩阵(中等) 59. 螺旋矩阵 II(中等) 有不少读者说,看过很多 ...
- python将矩阵顺时针旋转90度_python 二维数组90度旋转的方法
如下所示: #!/usr/bin/env python #-*- coding: utf-8 -*- """ [0, 1, 2, 3] [0, 1, 2, 3] [0, ...
- 二维数组横向和纵向遍历的巨大差距:缺页问题
缺页问题 缺页是引入了虚拟内存后的一个概念.操作系统启动后,在内存中维护着一个虚拟地址表,进程需要的虚拟地址在虚拟地址表中记录.一个程序被加载运行时,只是加载了很少的一部分到内存,另外一部分在需要时再 ...
- java交换二维数组行列_java二维数组行列
培训系列AmberXie 求二维数组行列之和把二维数组 a 各行之和分别放入 b... 二维数组例题答案[技巧] [例 1]编写程序,利用二维数组在窗体上输出如图 5x5...如果没有 max 为行列 ...
- Python 对称矩阵顺时针旋转90度
方式一:这种方法是从右下角至上开始读取,然后依次向左读取,但是时间复杂度过高,建议看方式二 # 把对称矩阵顺时针旋转90度 # 该法问从左下角往上读取,再重新构造矩阵,时间复杂度叫高 matrix = ...
最新文章
- GPU—加速数据科学工作流程
- Learn OpenGL (五):向量
- aaynctask控制多个下载进度_AsyncTask用法解析-下载文件动态更新进度条
- the application has stopped unexpected。please try again
- linux模块化机制,Linux模块化机制和module_init
- Linux中deb软件包管理怎么看,Deb软件包管理
- 获取 子文件夹 后缀_CSDN学院第一个Ptython Homework-- 递归统计文件夹大小
- mmdetection工程训练文件配置小结
- 为什么使用linux内核,为什么Linux内核使用它所做的数据结构?
- Failed to start bean ‘documentationPluginsBootstrapper‘;
- Hadoop学习之路(二十七)MapReduce的API使用(四)
- OSAL工作机制分析
- linux安装yarn
- java ipv6工具,支持通过IPv6地址和子网大小 计算开始结束地址
- Hexo在博客中插入图片
- 虚拟现实内容开发收费标准
- Tensorflow框架初识
- Unity3D游戏开发之在uGUI中使用不规则精灵制作按钮
- 财商教育—百万富翁的生活习惯
- Excel中日期、数字、中文大写金额等转文本
热门文章
- 自动机器学习新进展!性能超过人类调参师6个点,AutoGluon 低调开源
- 反正我不信!马斯克谈元宇宙:没人愿意把屏幕贴脸上
- 一眼识别这是什么鸟,比人类还厉害的“我们来找茬”十级选手诞生!
- 她是直播聊学习成“网红”的北大博士,毕业后入职民办学校,年薪70万
- 斯坦福连续发了四年的 AI 报告,今年讲了什么?
- 业界首个面向NLP场景深度迁移学习框架
- 为什么 Python 没有 main 函数?
- 利用蒙特卡罗法,国外老哥成功制造出 100% 投篮命中的篮板!
- 国内高校简称撞车史:南大、西大、东大都在争,唯独北大没人抢
- 在Linux系统中安装pycharm详解