题目分析:
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?
Subscribe to see which companies asked this question
题目的大意是:
给你一个n*n的2D矩阵,你需要旋转这个矩阵90度~
example:[[1,2,3],[4,5,6],[7,8,9]] to [[7,4,1],[8,5,2],[9,6,3]] 大家可以写纸上~这样就很明白了~
大家推演推演就可以知道,matrix[i][j] = matrix[new_i][new_j]转换的关系是:new_i ->n+1-j || new_j->i
另外一个要注意的问题就是:要注意如何遍历矩阵,要知道如果你将matrix[i][j]用目标元素替换了,你就不能再获得matrix[i][j]的原始数据了。
思路一:备份一个输入矩阵,然后按照转换关系遍历矩阵就行了。时间复杂度O(n*2) 空间复杂度O(n*2)
思路二:如果我们接着分析,我们可以发现显然没有必要备份一个矩阵。
我们可以发现这个替换关系是:a<-b,b<-c,c-<d,d<-a。(大家可以举一个二维的例子试试)
所以每次我们只需要备份a,然后完成这样一个循环就行了。
接着分析,实际上矩阵的外围只可能映射到外围上。所以每次我们只需要映射完矩阵的外围,然后找矩阵的内嵌矩阵接着进行这样的操作就可以了。这样的过程类似“回”这样一个结构。
所以最后:时间复杂度O(n*2) 空间复杂度O(1)
贴上代码:
public class Solution {
public void rotate(int[][] matrix) {
int temp;
int a,b,new_a,new_b;
for(int i=0;i<matrix.length-i;i++){
for(int j=i;j<matrix.length-i-1;j++){
a =i;b=j;
temp = matrix[a][b];
new_b= a;
new_a = matrix.length-1-b;
matrix[a][b] = matrix[new_a][new_b];
b = new_a;
a = matrix.length-1-new_b;
matrix[new_a][new_b] = matrix[a][b];
new_b = a;
new_a = matrix.length-1-b;
matrix[a][b] = matrix[new_a][new_b];
matrix[new_a][new_b] = temp;
}
}
}
}
运行结果:
运行的速度估计跟服务器当前的负载情况有关,仅供参考~