1. 程式人生 > 其它 >2021-01-03 | 59. 螺旋矩陣 II

2021-01-03 | 59. 螺旋矩陣 II

技術標籤:2021 LeetCode每日一題leetcode資料結構演算法JavaScriptjs

1. 題目描述

給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。

示例:

輸入: 3
輸出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

2. 解題思路

這道題目的思路和54.螺旋矩陣的思路是很像的,可以說這個題目就是54題的逆推。

這裡我們定義了四個邊界:

  • 上邊界 top : 0
  • 下邊界 bottom : n - 1
  • 左邊界 left : 0
  • 右邊界 right : n - 1

同時還定義了一個cur,它表示當前的值,在每次給矩陣賦值的時候都會加一。需要注意的是,在每遍歷完一條邊,都會將這條邊向中心進行縮窄,知道最後cur等於n*n的,則遍歷結束。

複雜度分析:

  • 時間複雜度:O(n * n), 在遍歷的過程中,需要給矩陣的每一個點進行賦值,這個矩陣中共有n * n個點,所以時間複雜度為O(n * n)。
  • 空間複雜度:O(n * n)。

3. 程式碼實現

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    const res = []
    for (let i = 0; i < n; i++) {   
        res[i] = [];
    }
    let top = 0, left = 0,
bottom = n - 1, right = n - 1, cur = 1 while(cur <= n * n){ // 遍歷上邊 for(let i = left; i <= right; i++){ res[top][i] = cur++ } top++ // 遍歷右邊 for(let i = top; i <= bottom; i++){ res[i][right] = cur++ } right--
// 遍歷下邊 for(let i = right; i >= left; i--){ res[bottom][i] = cur++ } bottom-- // 遍歷左邊 for(let i = bottom; i >= top; i--){ res[i][left] = cur++ } left++ } return res };

4. 提交結果

在這裡插入圖片描述