LeetCode筆記——59螺旋矩陣Ⅱ
題目:
給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。
示例:
輸入: 3 輸出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:直接看了網上大神的程式碼和leetcode上最快的程式碼。先把這兩個程式看懂。
程式碼:
public class Solution { public int[][] generateMatrix(int n) { int[][] result = new int[n][n]; int layer; int k; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { layer = layer(i, j, n); // 當前座標外有幾層 // n * n - layer * layer外圍層使用的最後一個數字(也是最大的) // 座標所在的當前層使用的第一個數字 k = n * n - (n - 2 * layer) * (n - 2 * layer) + 1; if (i == layer) { // 情況一、座標離上邊界最近 result[i][j] = k + j - layer; } else if (j == n - layer - 1) { // 情況二、座標離右邊界最近 result[i][j] = k + (n - 2 * layer - 1) + i - layer; } else if (i == n - layer - 1) { // 情況三、座標離下邊界最近 result[i][j] = k + 3 * (n - 2 * layer - 1) - (j - layer); } else { // 情況三、座標離左邊界最近 result[i][j] = k + 4 * (n - 2 * layer - 1) - (i - layer); } } } return result; } /** * 在一個n*n的矩陣中,計算(x,y)座標外有多少層,座標從0開始計算 * * @param x 橫座標 * @param y 縱座標 * @param n 矩陣大小 * @return 座標外的層數 */ public int layer(int x, int y, int n) { x = x < n - 1 - x ? x : n - 1 - x; // 計算橫座標離上下邊界的最近距離 y = y < n - 1 - y ? y : n - 1 - y; // 計算縱座標離左右邊界的最近距離 return x < y ? x : y; // 較小的值為座標的外圍層數 } }
執行最快的程式碼:
按照上,右,下,左的順序形成矩陣
class Solution { public int[][] generateMatrix(int n) { int[][] matrix = new int[n][n]; int len = n; int row = 0, col = 0; int temp = 1; int start = 0 ; while (len >= start*2) { for (int i = start; i < len - 1 - start ; i++) { matrix[row][col++] = temp++; } for (int i = start; i < len - 1 - start ; i++) { matrix[row++][col] = temp++; } for (int i = start; i < len - 1- start; i++) { matrix[row][col--] = temp++; } for (int i = start; i < len - 1- start; i++) { matrix[row--][col] = temp++; } row++; col++; start++; } if (n % 2 != 0){ matrix[n/2][n/2] = temp; } return matrix; } }