1. 程式人生 > >LeetCode筆記——59螺旋矩陣Ⅱ

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;
    }
}