分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程
package live.every.day.ProgrammingDesign.CodingInterviewGuide.ArrayAndMatrix;
import java.util.Arrays;
/**
* 将正方形矩阵顺时针转动90度
*
* 【题目】
* 给定一个NXN的矩阵matrix,把这个矩阵调整成顺时针转动90°后的形式。
*
* 【要求】
* 额外空间复杂度为O(1)。
*
* 【难度】
* 简单
*
* 【解答】
* 这里仍使用分圈处理的方式,在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵。比如,题目中的矩
* 阵,当(tR,tC)=(0,0)、(dR,dC)=(3,3)时,表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下。
* 1 2 3 4
* 5 8
* 9 12
* 13 14 15 16
* 在这个外圈中,1,4,16,13为一组,然后让1占据4的位置,4占据16的位置,16占据13的位置,13占据1的位置,一组就调整完了。
* 然后2,8,15,9为一组,继续占据调整的过程,最后3,12,14,5为一组,继续占据调整的过程。然后(tR,tC)=(0,0)、
* (dR,dC)=(3,3)的子矩阵外层就调整完毕。接下来令tR和tC加1,即(tR,tC)=(1,1),令dR和dc减1,即(dR,dC)=(2,2),此时
* 表示的子矩阵如下。
* 6 7
* 10 11
* 这个外层只有一组,就是6,7,11,10,占据调整之后即可。所以,如果子矩阵的大小是MxM,一共就有M-1组,分别进行占据调整即
* 可。
* 具体过程请参看如下代码中的rotate方法。
*
* @author Created by LiveEveryDay
*/
public class RotateSquareMatrix90Degree {
public static void rotate(int[][] m) {
int tR = 0;
int tC = 0;
int dR = m.length - 1;
int dC = m[0].length - 1;
while (tR < dR) {
rotateEdge(m, tR++, tC++, dR--, dC--);
}
}
private static void rotateEdge(int[][] m, int tR, int tC, int dR, int dC) {
int times = dC - tC; // 总的组数
int tmp = 0;
for (int i = 0; i != times; i++) { // 一次循环就是一组占据调整
tmp = m[tR][tC + i];
m[tR][tC + i] = m[dR - i][tC];
m[dR - i][tC] = m[dR][dC - i];
m[dR][dC - i] = m[tR + i][dC];
m[tR + i][dC] = tmp;
}
}
public static void main(String[] args) {
int[][] m = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
rotate(m);
for (int[] i : m) {
System.out.println(Arrays.toString(i));
}
}
}
// ------ Output ------
/*
[13, 9, 5, 1]
[14, 10, 6, 2]
[15, 11, 7, 3]
[16, 12, 8, 4]
*/