原題:
給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。
示例:
輸入: 3
輸出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/spiral-matrix-ii
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解法一:
思路:類似於剝洋蔥那種,順時針得逐層進行填充。
程序一:
先對第一層進行填充即temp == 1 時,之後對第二層即temp == 2 時進行填充,逐層進行填充。同時第54的螺旋矩陣同樣也可以使用這個方法進行遍歷。
** 這個程序我覺得最巧妙的地方在於使用了temp來控制遍歷的層數。 **
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
temp = 1
start = 0
mat = [[0 for _ in range(n)] for _ in range(n)]
while temp <= n:
for i in range(temp-1, n - temp+1): # left to right
start += 1
mat[temp-1][i] = start
for i in range(temp, n - temp + 1): # top to bottom
start += 1
mat[i][n-temp] = start
for i in range(n - temp -1 , temp-2, -1): # right to left
start += 1
mat[n-temp][i] = start
for i in range(n - temp - 1, temp-1, -1): # bottom to top
start += 1
mat[i][temp-1] = start
temp += 1
return mat
程序二:
思路:同樣也是逐層遍歷,但是程序的實現方法是使用四個變量進行邊界控制,與上一個程序僅僅使用一個temp變量有所不同。
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
l, r, t, b = 0, n - 1, 0, n - 1
mat = [[0 for _ in range(n)] for _ in range(n)]
num, tar = 1, n * n
while num <= tar:
for i in range(l, r + 1): # left to right
mat[t][i] = num
num += 1
t += 1
for i in range(t, b + 1): # top to bottom
mat[i][r] = num
num += 1
r -= 1
for i in range(r, l - 1, -1): # right to left
mat[b][i] = num
num += 1
b -= 1
for i in range(b, t - 1, -1): # bottom to top
mat[i][l] = num
num += 1
l += 1
return mat