LeetCode54、59:螺旋矩阵|、||(递归,模拟)
解题思路:定义一个方向数组,用栈或者直接从左上角的起点进行DFS,如果碰到下一步无法访问,调整方向,继续遍历,直到所有元素都访问了。
(这道题好有历史感,到现在还记得我读大一的时候参加院队培训的时候做的,当时还不会搜索,只会找规律,没想到找了好长时间的规律真让做对了,当时还是很兴奋。后来蓝桥杯好像也出现过一道类似的题目,那时候就没有再去找规律了,或许也是时间来不及,hhh,大一到研一,时间真的像是白驹过隙,自己也是越来越没有当初的敢打敢拼,思虑的东西也越来越多,希望自己能够拾回大一大二的那种意气风发的感觉,冲冲冲!)
1 class Solution:
2 def dfs(self,matrix,i,j,idx):
3 self.vis[i][j]=1
4 self.ans.append(matrix[i][j])
5 for k in range(4):
6 k = (idx+k)%4
7 x = i+self.fx[k][0]
8 y = j+self.fx[k][1]
9 if 0<=x<self.n and 0<=y<self.m and not self.vis[x][y]:
10 self.dfs(matrix,x,y,k)
11 break
12 return
13 def spiralOrder(self, matrix):
14 self.fx = [[0,1],[1,0],[0,-1],[-1,0]]
15 self.vis = [[ 0 for j in range(len(matrix[i]))]for i in range(len(matrix))]
16 self.n,self.m = len(matrix),len(matrix[0])
17 self.ans = []
18 self.dfs(matrix,0,0,0)
19 return self.ans
螺旋矩阵||也是一样的解法。
1 #没用的变量都没删
2 class Solution:
3 def dfs(self,val,i,j,idx):
4 self.vis[i][j]=1
5 self.matrix[i][j]=val
6 val+=1
7 for k in range(4):
8 k = (idx+k)%4
9 x = i+self.fx[k][0]
10 y = j+self.fx[k][1]
11 if 0<=x<self.n and 0<=y<self.m and not self.vis[x][y]:
12 self.dfs(val,x,y,k)
13 val+=1
14 break
15 return
16 def generateMatrix(self, n):
17 self.matrix = [[0 for j in range(n) ] for i in range(n)]
18 self.fx = [[0,1],[1,0],[0,-1],[-1,0]]
19 self.vis = [[ 0 for j in range(n)]for i in range(n)]
20 self.n,self.m = n,n
21 self.dfs(1,0,0,0)
22 return self.matrix