一入循环深似海,代码随想录螺旋矩阵二刷
代码随想录螺旋矩阵二刷
leetcode59
来看下螺旋矩阵。螺旋矩阵这道题确实很容易写着写着就绕进去了。首先读下题。给出正整数n,生成n*n的矩阵。
我们来看其中一个用例,完成一个圈是需要四个循环去填充。但是四条边填充的时候要始终保持一样的规则,比如左闭右开的规则。那么转几圈呢。需要外部一个循环来控制,是不是就是n决定的。也就是n//2.决定循环次数。
具体程序如下:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
startx,starty,count = 0,0,1
control = n // 2
result = [[0] * n for _ in range(n)]
for offset in range(1,control + 1):
for i in range(starty,n-offset):
result[startx][i] = count
count += 1
for i in range(startx,n-offset):
result[i][n-offset] = count
count += 1
for i in range(n-offset,starty,-1):
result[n-offset][i] = count
count += 1
for i in range(n-offset,startx,-1):
result[i][starty] = count
count += 1
startx += 1
starty += 1
if n % 2 == 1:
result[n // 2][n // 2] = count
return result
我们需要定义开始填充的x和y坐标。也就是行开始坐标和列开始坐标。并且由于我们遍历的终点是取不到的,并且这个位置是跟你在第几圈循环是有关系的。所以外层循环变量定义为offset,内层循环遍历的终点就为n-offset。
内层第一次循环:行坐标不变,列坐标改变,所以定义范围(starty,n-offset)。
第二次循环,列不变,行发生变化。所以定义范围(startx,n-offset).
同理可得第三次和第四次循环。
完成第一圈后,行列开始坐标都要增加1.
如果n是奇数的话,中间还剩一个单独要填充的。所以需要单独判断并填充。
leetcode54
这道题是上面那道题的简化版。基本和上面的过程是类似的。
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
startx,starty,= 0,0
if not matrix or not matrix[0]:
return []
m, n = len(matrix), len(matrix[0])
endx,endy = m,n
if m == 1 and n == 1:
return [matrix[0][0]]
result = []
control = min(m,n)//2
for offset in range(control):
for i in range(starty,endy-1):
result.append(matrix[startx][i])
for i in range(startx,endx-1):
result.append(matrix[i][endy-1])
for i in range(endy-1,starty,-1):
result.append(matrix[endx-1][i])
for i in range(endx-1,startx,-1):
result.append(matrix[i][starty])
startx += 1
starty += 1
endx -= 1
endy -= 1
if startx < endx and starty == endy - 1:
# 只剩一列,遍历这一列的所有行
for i in range(startx, endx):
result.append(matrix[i][starty])
elif starty < endy and startx == endx - 1:
# 只剩一行,遍历这一行的所有列
for i in range(starty, endy):
result.append(matrix[startx][i])
return result
这道题由于不是方阵,就稍微麻烦点,这个地方还需要多看看才能熟悉。
本文来自博客园,作者:Bathwind_W,转载请注明原文链接:https://www.cnblogs.com/bathwind/p/18314964