2021-01-03 | 59. 螺旋矩陣 II
阿新 • • 發佈:2021-01-04
技術標籤: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
};