本文已参与「新人创作礼」活动,一起开启掘金创作之路
旋转矩阵
有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。
给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵。
数据范围:,矩阵中的值满足
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度
示例1
输入
[[1,2,3],[4,5,6],[7,8,9]],3
输出
[[7,4,1],[8,5,2],[9,6,3]]
import java.util.*;
public class Solution {
public int[][] rotateMatrix(int[][] mat, int n) {
// write code here
rotate(mat);
return mat;
}
static public void rotate(int [][] matrix) {
int a = 0;
int b = 0;
int c = matrix.length-1;
int d = matrix[0].length-1;
while(a<c) {
rotateEdge(matrix,a++,b++,c--,d--);
}
}
static public void rotateEdge(int [][] matrix,int a,int b,int c,int d) {
int temp = 0;
for(int i=0;i<d-b;i++) {
temp = matrix[a][b+i];
matrix[a][b+i] = matrix[c-i][b];
matrix[c-i][b] = matrix[c][d-i];
matrix[c][d-i] = matrix[a+i][d];
matrix[a+i][d] = temp;
}
}
}
旋转矩阵(扩展1)
先从最外圈由左往右遍历,往下,往左,最后往上,进入下一圈
输入3 4
1 2 3 4
5 6 7 8
9 10 11 12
输出 1 2 3 4 8 12 11 10 9 5 6 7 8
import java.util.*;
public class Solution {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
int n = sc.nextInt();
int m = sc.nextInt();
int[][] matrix = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
matrix[i][j] = sc.nextInt();
}
lessen(matrix);
}
static void lessen(int matrix[][]) {
int a = 0;
int b = 0;
int c = matrix.length-1;
int d = matrix[0].length-1;
while (b <= d && a <= c) {
toPrint(matrix, a++, b++, c--, d--);
}
}
static void toPrint(int[][] matrix, int a, int b, int c, int d) {
for (int i = b; i < d; i++)
System.out.print(matrix[a][i]);
for (int i = a; i < c; i++)
System.out.print(matrix[i][d]);
for (int i = d; i > b; i--)
System.out.print(matrix[c][i]);
for (int i = c; i > a; i--)
System.out.print(matrix[i][b]);
}
}
旋转矩阵(扩展2)
先斜往上遍历,后斜往下遍历,又斜往上遍历
输入3 4
1 2 3 4
5 6 7 8
9 10 11 12
输出
1 5 2 3 6 9 10 7 4 8 11 12
import java.util.*;
public class Solution {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
int n = sc.nextInt();
int m = sc.nextInt();
int[][] matrix = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
matrix[i][j] = sc.nextInt();
}
rotate(matrix);
}
static void rotate(int [][] matrix) {
int a,b,c,d;
a = b = c = d = 0;
int n = matrix.length-1;
int m = matrix[0].length-1;
int flag = 1;//1 表示斜向下,-1表示斜向上
while(a<=n && b<=m) {
toRotate(matrix,a,b,c,d,flag);
if(b<m) b++;
else a++;
if(c<n) c++;
else d++;
flag *= -1;
}
}
static void toRotate(int [][] matrix,int a,int b,int c,int d,int flag) {
if(flag == 1) {
for(int i=a,j=b;i<=c&&j>=d;i++,j--)
System.out.println(matrix[i][j]);
}
else {
for(int i=c,j=d;i>=a&&j<=b;i--,j++) {
System.out.println(matrix[i][j]);
}
}
}
}
\