目录
题目:
思路:
上代码:
结果:
大佬题解:
思路:
代码:
结果:
题目:
这题 模拟 来做
思路:
方向转换:使用矩阵(4个元素,每个元素都对i,j的值变化做规定),按照右下左上的顺序进行
遍历的终点:元素总数目(for进行总循环)
矩阵是否越界:当前规则下的next i和j是否满足(边界内且未被查找),不满足则调整方向
查找标记:帮助定位边界,定义一个同样的矩阵,-101初始,查找就101(因为题目数字范围-100~100)
上代码:
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
m=len(matrix)
n=len(matrix[0])
#创建查找过的矩阵,题目-100~100,其实可以定义为101,false也行
visit=[[-101]*n for _ in range(m)]
total=m*n
#创建输出列表
ret=[]
#方向矩阵(两个元素分别表示i和j应该进行的操作,例如[0,1]表示i不变,j+1)
#右,下,左,上,按照模拟的顺序依次进行
dit=[[0,1],[1,0],[0,-1],[-1,0]]
diti=0 #表示方向的下标
i,j=0,0
for t in range(total):
ret.append(matrix[i][j])
visit[i][j]=101
#判断下一个位置的坐标是否超过矩阵范围
ni=i+dit[diti][0]
nj=j+dit[diti][1]
#如果不满足条件,就要跳转方向
if not (0<=ni<m and 0<=nj<n and visit[ni][nj]!=101):
diti=(diti+1)%4
#满足就按照当前规则遍历
i+=dit[diti][0]
j+=dit[diti][1]
return ret
结果:
大佬题解:
思路:
先装下第一行
然后将矩阵逆时针旋转90度
*matrix能够转置,例如最右边一列会被放在最后一行
[::-1]就会将最后一行放在第一行,下一次循环,输出第一行,然后再选择--------
代码:
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
ret=[]
while matrix:
#装下第一行
ret+=matrix.pop(0)
#然后将矩阵逆时针旋转90度
#*matrix能够转置,例如最右边一列会被放在最后一行
#[::-1]就会将最后一行放在第一行,下一次循环,输出第一行,然后再选择--------
matrix=list(zip(*matrix))[::-1]
return ret
结果:
牛啊