一个把矩阵旋转输出的方法就是直接按照旋转以后的规律遍历输出
但有时候需要把矩阵旋转一工后续使用,如果不创建一个新的矩阵直接做原有矩阵基础上做旋转该如何操作呢
一个用java实现的算法
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class PrintMatrix {
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
int[][] a = new int[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
a[i][j] = StdIn.readInt();
transMatrix(a);
printMatrix(a);
}
public static void transMatrix(int[][] a) {
int N = a.length;
for (int i = 0; i < N / 2; i++)
for (int j = i; j < N - 1 - i; j++)
circleTrans(a, i, j);
}
public static void printMatrix(int[][] a) {
int N = a.length;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
StdOut.printf((j == N - 1) ? "%4d\n" : "%4d", a[i][j]);
}
private static void circleTrans(int[][] a, int i, int j) {
int N = a.length;
int temp = a[i][j];
for (int m = 0; m < 3; m++) {
int x = N - 1 - j;
int y = i;
a[i][j] = a[x][y];
i = x;
j = y;
}
a[i][j] = temp;
}
}
运行结果
Press ENTER or type command to continue
1 2 3
3 4 6
7 8 9
7 3 1
8 4 2
9 6 3
时间复杂度是 O(N^2)空间复杂度是 O (1)