No59. 螺旋矩阵 II
题目
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例
- 输入: 3
- 输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
解题代码(Python3)
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
#返回以i开始,nums个数据
def getData(i,nums):
return [x for x in range(i,i+nums)]
def setCol(i,col,up,down):
data = getData(i,down - up - 1)
if col == up:
data = data[::-1]
for index,x in enumerate(data):
matrix[up+1+index][col] = x
#设置每圈的顺时针数据
def setRound(i,left,right):
#n为奇数时 只有一个元素
if left == right:
matrix[left][right] = i
return i + 1
else:
dis1 = right - left + 1
dis2 = right - left - 1
#分别设置上右下左4块
matrix[left][left:right+1] = getData(i,dis1)
setCol(i+dis1,right,left,right)
matrix[right][left:right+1] = getData(i+dis1+dis2,dis1)[::-1]
setCol(i+2*dis1+dis2,left,left,right)
return i + 2*dis1 + 2*dis2
matrix = [[-1]*n for i in range(n)]
left = 0
right = n - 1
i = 1
while i <= n**2:
i = setRound(i,left,right)
left += 1
right -= 1
return matrix
思路:
与上一题类似,只不过由“访问”变为“改变”,涉及到二维List的赋值,所以相对要繁琐一点。依然以每一圈为一轮,分别对上右下左4块进行赋值,同时维护当前值i的大小。
注意,当n为偶数时,无特殊情况;当n为奇数时,最后中间会有一个单独的值进行赋值。
复杂度分析:
- 时间复杂度 O(nlogn) 最外层循环是对数级别,自定义函数中涉及到
[::-1]
所以是n包裹logn - 空间复杂度 O(n)
注意这时的n实际上为n^2