分享一个大牛的人工智能教程。零基础通俗易懂风趣幽默希望你也加入到人工智能的队伍中来请轻击人工智能教程大家好欢迎来到我的网站 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑人工智能时代就要来临了科… 继续阅读 前言https://www.captainai.net/troubleshooterpackage 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 * 在这个外圈中141613为一组然后让1占据4的位置4占据16的位置16占据13的位置13占据1的位置一组就调整完了。 * 然后28159为一组继续占据调整的过程最后312145为一组继续占据调整的过程。然后(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 * 这个外层只有一组就是671110占据调整之后即可。所以如果子矩阵的大小是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] */