LeetCode第[48]题(Java):Rotate Image
题目:矩阵旋转
难度:Medium
题目内容:
You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Note:
You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.
翻译:你有一个n*n 的2D矩阵表示一个图像。
将图像旋转90度(顺时针)。
注意:
你必须在原地旋转图像,这意味着你必须直接修改输入2D矩阵。不要分配另一个2D矩阵并进行旋转。
Example 1:
Given input matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
], rotate the input matrix in-place such that it becomes:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
Example 2:
Given input matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
], rotate the input matrix in-place such that it becomes:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
我的思路:旋转90°,那就是把矩阵分为四块,只对第一块进行循环,然后用第一块的元素下标【i】【j】的表达式分别表示其他块的对应元素,然后把四个元素进行交换即可。
先将矩阵分为如下四块:
A B
C D
现在对A内元素进行循环,其元素下标表示为【i】【j】
1、将A的此元素用temp存储起来,
2、A的此元素取C区域对应的元素值,C区对应元素表示为A元素“先关于矩阵主对角线取对称,然后再取纵向中心对折”
主对角线取对称,就是【i】【j】=》【j】【i】
纵向中心对折,就是【i】【j】=》【n-1- i 】【j】
3、C区此元素取D区域对应的元素值,D区对应元素表示为A元素的中心对称,即“先关于横向中心对折,然后再取纵向中心对折”
横线中心对折,就是【i】【j】=》【i】【n-1- j】
4、D区此元素取B区域对应的元素值,B区对应元素表示为A元素“先关于横向中心对折,然后再取矩阵副对角线对称”
副对角线对称,就是【i】【j】=》【n-1-j】【n-1-i】
5、B区此元素取之前A区的值,即为 temp ,到此一轮交换结束。
需要注意的是,当矩阵的大小是偶数的时候,此时行数的对称中心 x 为对称线的上面的一个。
例如:
0
1
2
3 此时的 x = n-1 = 1,此时是需要进行交换的行范围是【0~x】,列范围也是【0~x】
而如果是奇数,则行范围是【0~x-1】,列范围没变还是【0~x】
所以循环的时候需要注意判断奇偶,然后跳过。
我的代码:
public void rotate(int[][] matrix) {
int n = matrix.length;
if (n <= 1) {
return;
}
int even = 1;
if (matrix.length % 2 == 1) {
even = 0;
}
int x = (n-1)/2;
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= x; j++) {
if (even==0 && i==x) {
continue;
}
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[n-1-(n-1-j)][n-1-i];
matrix[n-1-(n-1-j)][n-1-i] = temp;
}
}
}
我的复杂度:O(N2)
编码过程中的问题:
1、应该使用A的元素下标【i】【j】去表示其他块所有,而不是用相对位置;
2、对“对称”“对折”的下标变化不熟悉,导致浪费不少时间;(还想了半天用 2x - i + even 来表示,其实直接 n-1-i 即可)
3、之前没考虑到矩阵奇偶对循环范围的影响,导致奇数的对称线没有交换;
4、当方法定义返回为void的时候,需要直接返回,写return就行。
答案代码:
public void rotate(int[][] matrix) {
int n = matrix.length;
if (n <= 1) {
return;
}
int x = (n-1)/2;
for (int i = 0; i <= x; i++) {
int[] tmp = matrix[i];
matrix[i] = matrix[n-1-i];
matrix[n-1-i] = tmp;
}
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
答案复杂度:O(N2)
答案思路:
首先将整个数组上下对称交换:
1 2 3 7 8 9
4 5 6 => 4 5 6
7 8 9 1 2 3
然后再关于主对角线对称交换:
7 8 9 7 4 1
4 5 6 => 8 5 2
1 2 3 9 6 3
优点:逻辑清晰明了
缺点:复杂度比我的方法高一点
扩展:
逆时针旋转90°?
我的方法——ABCD块之间的取值关系会发生变化。
答案方法——有两种修改方法都行:
a:第一步和第二步交换,即先对角线,后对折
b:把第一步的上下对称交换改成左右对称交换,第二步不变。
LeetCode第[48]题(Java):Rotate Image的更多相关文章
- LeetCode第[18]题(Java):4Sum 标签:Array
题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + ...
- LeetCode第[1]题(Java):Two Sum 标签:Array
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2
题目:求所有全排列 难度:Medium 题目内容: Given a collection of distinct integers, return all possible permutations. ...
- LeetCode第[1]题(Java):Two Sum (俩数和为目标数的下标)——EASY
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- LeetCode第[11]题(Java):Container With Most Water 标签:Array
题目难度:Medium Given n non-negative integers a1, a2, ..., an, where each represents a point at coordina ...
- LeetCode第[4]题(Java):Median of Two Sorted Arrays 标签:Array
题目难度:hard There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median ...
- LeetCode第[29]题(Java):Divide Two Integers
题目:两整数相除 难度:Medium 题目内容: Given two integers dividend and divisor, divide two integers without using ...
- LeetCode第[11]题(Java):Container With Most Water (数组容器盛水)——Medium
题目难度:Medium Given n non-negative integers a1, a2, ..., an, where each represents a point at coordina ...
- LeetCode第[4]题(Java):Median of Two Sorted Arrays (俩已排序数组求中位数)——HARD
题目难度:hard There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median ...
随机推荐
- java基础09 数组的使用
/** * 求数组中的最大值 */ @Test public void test14(){ //定义一个数组 参赛的选手 int [] nums={50,20,30,80,100,90}; //定义一 ...
- c#与lua交互里,错误处理
如果是c#代码出错了 [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))] static int _g_get_down(RealStatePtr ...
- USB 3.0:那些你需要知道的事
在过去14年来,通用串行总线(USB)已成为计算机和外部设备之间的标准接口.不管是移动硬盘.相机.鼠标.键盘.打印机,还是扫描仪,它们和计算机之间的数据传输一般均采用USB线.USB接口也的确是“通用 ...
- python项目环境的导出、导入
导出开发环境 pip freeze > requirements.txt # 文件导出路径 导入环境 pip install -r requirements.txt # pip 则会自动下载安装 ...
- Nginx+Springboot+Vue 前后端分离 解决跨域问题
1:前端vue 写完 打包 npm run build prod 2: 后端api 写完打包 springboot mvn package -Dmaven.test.skip=true 3: ngin ...
- SQL2000查看表的大小
SQL2000查看表的大小 标签: sqlsql server数据库报表tableinsert 2011-06-08 11:47 4013人阅读 评论(0) 收藏 举报 SQL2000查看表的大小 本 ...
- (转)live555在Linux下最简单地实现实时流媒体点播
通过Live555交叉编译后运行发现,上面实现的流媒体实时通过文件服务器的文件点播,没有相关的流媒体实现方式, 但在Linux下,可以通过某些技巧实现Live555服务器实时流媒体服务器,并且是傻瓜式 ...
- HDU - 6435 Problem J. CSGO 2018 Multi-University Training Contest 10 (二进制枚举+思维)
题意:有N个主武器(MW)和M个副武器(SW),每个武器都有自己的S值,和K个附加属性xi.要选取一对主副武器搭配,搭配后获得的性能由该公式得出: 求获得最大的性能为多少. 分析:由于|xm - xs ...
- 给IT男推荐一款车
标题是为了吸引人,其实这里要推荐的不是汽车而是自行车,确切的说是电动自行车(也有叫锂电自行车),见下图! (备注:淘宝截图,有便宜的2K就能搞定,好点的像这一款3K吧!) 码农这个词真不是瞎叫的,做这 ...
- grads 新老版本目录对比
最近不少人都在使用OpenGrADS,最新的版本已经更新到了2.0.a9,具体grads做了哪些更新,在附件里面放了一个,是英文的. 很多人说在使用原来的一些教程的时候找不到相对应的文件夹了,其实仔细 ...