此博客为《代码随想录》数组章节的学习笔记,主要内容为数组模拟的相关题目解析。
文章目录
59. 螺旋矩阵 II
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
l, r, t, b = 0, n - 1, 0, n - 1
res = [[0 for _ in range(n)] for _ in range(n)]
num, tar = 1, n * n
while num <= tar:
for i in range(l, r + 1):
res[t][i] = num
num += 1
t += 1
for i in range(t, b + 1):
res[i][r] = num
num += 1
r -= 1
for i in range(r, l - 1, -1):
res[b][i] = num
num += 1
b -= 1
for i in range(b, t - 1, -1):
res[i][l] = num
num += 1
l += 1
return res
图源自 Krahets 的题解
- 定长二维数组创建的方式:内层 for 循环写第二维的维数,外层 for 循环写第一维的维数。
- l, r, t, b 这四个量均为闭区间,在 range() 中需要有 +1 / -1 的操作。
54. 螺旋矩阵
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
m, n = len(matrix), len(matrix[0])
l, r, t, b = 0, n - 1, 0, m - 1
res = [0 for _ in range(m * n)]
num, tar = 0, m * n - 1
while num <= tar:
for i in range(l, r + 1):
res[num] = matrix[t][i]
num += 1
t += 1
if num > tar: break
for i in range(t, b + 1):
res[num] = matrix[i][r]
num += 1
r -= 1
if num > tar: break
for i in range(r, l - 1, -1):
res[num] = matrix[b][i]
num += 1
b -= 1
if num > tar: break
for i in range(b, t - 1, -1):
res[num] = matrix[i][l]
num += 1
l += 1
if num > tar: break
return res
- 与 螺旋矩阵II 类似,但矩阵为长方形。
- 长方形的矩阵需要在每一个内层 for 循环后添加判断,例如
if num > tar: break
,因为可能无法完成上、右、下、左完整的一圈。 - 正方形的矩阵可以省略内层 for 循环后的判断,因为每次都能完整走完一圈,判断操作交给 while 循环即可。