lc.54
1、计算turns
2、注意边界,我采用【 )
3、offset很妙!
4、奇、偶注意最后填充情况
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
#[ )
res = [[0] * n for _ in range(n)]
turns = n // 2
count = 1
start_x = 0
start_y = 0
offset = 1
while turns:
i = start_x
j = start_y
while j < n - offset:
res[i][j] = count
count += 1
j += 1
while i < n - offset:
res[i][j] = count
count += 1
i += 1
while j >= offset:
res[i][j] = count
count += 1
j -= 1
while i >= offset:
res[i][j] = count
count += 1
i -= 1
turns -= 1
offset += 1
start_x += 1
start_y += 1
if n % 2 == 1:
res[n//2][n//2] = count
return res
lc.59——lc54的通用版本
1、turns其实由min(m,n)决定
2、最后的填充也由min(m, n)决定
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
m = len(matrix)
n = len(matrix[0])
res = []
start_x = 0
start_y = 0
offset = 1
turns = min(m, n) // 2
while turns:
i = start_x
j = start_y
while j < n - offset:
res.append(matrix[i][j])
j += 1
while i < m - offset:
res.append(matrix[i][j])
i += 1
while j >= offset:
res.append(matrix[i][j])
j -= 1
while i >= offset:
res.append(matrix[i][j])
i -= 1
turns -= 1
offset += 1
start_x += 1
start_y += 1
if min(m, n) % 2 == 1:
if m <= n:
for j in range(start_y, n - start_y):
res.append(matrix[start_x][j])
else:
for i in range(start_x, m - start_x):
res.append(matrix[i][start_y])
return res