题目描述
牛客网:NC18 顺时针旋转数组
有一个NxN整数矩阵,请编写一个算法,输入NxN矩阵和就很的结束N,将矩阵顺时针旋转90度后返回。
示例
输入:[[1,2,3],[4,5,6],[7,8,9]],3
输出:[[7,4,1],[8,5,2],[9,6,3]]
如下图所示:
题目解析
方法一:创建新的矩阵
创建新的矩阵ans[n][n]
用于存储旋转后的值,遍历原数组即可
根据旋转规律可以看出:ans[i][j] = mat[n - j - 1][i]
;
public int[][] rotateMatrix(int[][] mat, int n) {
// write code here
int[][] ans = new int[n][n];
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
ans[i][j] = mat[n - j - 1][i];
}
}
return ans;
}
空间复杂度为O(n2)
方法二:原地旋转
根据方法一可以得出旋转规律:ans[i][j] = mat[n - j - 1][i]
,若对矩阵进行原地旋转,实际上是每四个位置交换数值。以下图红框内的数为例,进行如下过程:
- 2原本的位置为
mat[i][j]
,则旋转之后为9,mat[i][j] = mat[n - 1 - j][i]
, - 9原本位置为
mat[n - 1 - j][i]
,旋转之后为15,mat[n - 1 - j][i] = mat[n - 1 - i][n - 1 - j]
, - 15原本位置为
mat[n - 1 - i][n - 1 - j]
,旋转之后为8,mat[n - 1 - i][n - 1 - j] = mat[j][n - 1 - i]
, - 8原本位置为
mat[j][n - 1 - i]
,旋转之后为2,mat[j][n - 1 - i] = mat[i][j]
, - 但
mat[i][j]
已经改为新值了,所以旋转之前应用临时变量存储该位置原本的值
public int[][] rotateMatrix(int[][] mat, int n) {
// write code here
for(int i = 0;i < n / 2;i++){
for(int j = 0;j < (n + 1) / 2;j++){
int temp = mat[i][j];
mat[i][j] = mat[n - 1 - j][i];
mat[n - 1 - j][i] = mat[n - 1 - i][n - 1 - j];
mat[n - 1 - i][n - 1 - j] = mat[j][n - 1 - i];
mat[j][n - 1 - i] = temp;
}
}
return mat;
}
空间复杂度为O(1)