/** * Given an integer n, generate a square matrix filled with elements from 1 to * n^2 in spiral order. * * For example, * Given n = 3, * * You should return the following matrix: * [ * [ 1, 2, 3 ], * [ 8, 9, 4 ], * [ 7, 6, 5 ] * ] * * Tags: Array */ class SpiralMatrix2 { public static void main(String[] args) { int[][] mat = generateMatrix(5); for (int i = 0; i < mat.length; i++) { for (int j = 0; j < mat[i].length; j++) { System.out.print(mat[i][j] + " "); } System.out.println(); } } /** * Track current level * Work level by level toward center */ public static int[][] generateMatrix(int n) { if (n <= 0) return new int[0][0]; int[][] ans = new int[n][n]; int num = 1; int lv = 0; while (2 * lv < n) { for (int i = lv; i < n - lv; i++) ans[lv][i] = num++; for (int i = lv + 1; i < n - lv; i++) ans[i][n - lv - 1] = num++; for (int i = n - lv - 2; i >= lv; i--) ans[n - lv - 1][i] = num++; for (int i = n - lv - 2; i >= lv + 1; i--) ans[i][lv] = num++; lv++; } return ans; } /** * use startR, endR, startC, endC to mark the range * update relative range whenever finish filling up a row or column */ public static int[][] generateMatrixB(int n) { if (n <= 0) return new int[0][0]; int[][] ans = new int[n][n]; int i = 1; int startR = 0; int startC = 0; int endR = n - 1; int endC = n - 1; while (startR <= endR && startC <= endC) { for (int j = startC; j <= endC; j++) ans[startR][j] = i++; startR++; for (int j = startR; j <= endR; j++) ans[j][endC] = i++; endC--; for (int j = endC; j >= startC; j--) ans[endR][j] = i++; endR--; for (int j = endR; j >= startR; j--) ans[j][startC] = i++; startC++; } return ans; } }