给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
数据范围:
,矩阵中任意元素都满足
要求:空间复杂度
,时间复杂度 )
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param matrix int整型二维数组 # @return int整型一维数组 # class Solution: def spiralOrder(self , matrix: List[List[int]]) -> List[int]: if not matrix: return [] result = [] left = 0 right = len(matrix[0]) - 1 up = 0 down = len(matrix) - 1 while left <= right and up <= down: # 在上边界,从左到右 for i in range(left,right+1): result.append(matrix[up][i]) # 上边界向下 up += 1 if up > down: break # 在右边界,从上到下 for i in range(up,down+1): result.append(matrix[i][right]) # 右边界向左 right -= 1 if left > right: break # 在下边界,从右到左 for i in range(right,left-1,-1): result.append(matrix[down][i]) # 下边界向上 down -= 1 if up > down: break # 在左边界,从下到上 for i in range(down,up-1,-1): result.append(matrix[i][left]) # 左边界右移 left += 1 if left > right: break return result
class Solution: def spiralOrder(self , matrix: List[List[int]]) -> List[int]: # 接收并处理数据 res=[] # 讨论是否为空 if matrix==[]: return res else: while 1 : new=[] # 取第一行为结果的一部分并删除第一行 for t in matrix[0]: res.append(t) del matrix[0] # 判断是否结束 if matrix ==[]: break # 旋转矩阵 for t in range(len(matrix[0])): data=[] for t1 in matrix: data.append(t1[len(matrix[0])-1-t]) new.append(data) matrix=new return res还行吧,过程挺巧的
遍历矩阵中的每一个元素
时间复杂度:O(mn) 空间复杂度:O(1)
class Solution: def spiralOrder(self , matrix: List[List[int]]) -> List[int]: res = [] n = len(matrix) if n == 0: return res left = 0 right = len(matrix[0]) - 1 up = 0 down = n - 1 while left <= right and up <= down: for i in range(left, right+1): res.append(matrix[up][i]) up += 1 if up > down: break for i in range(up, down+1): res.append(matrix[i][right]) right -= 1 if right < left: break i = right while i >= left: res.append(matrix[down][i]) i -= 1 down -= 1 if down < up: break i = down while i >= up: res.append(matrix[i][left]) i -= 1 left += 1 if left > right: break return res
挨打解法
class Solution: def spiralOrder(self , matrix: List[List[int]]) -> List[int]: res = [] while matrix: res += matrix[0] matrix = list(zip(*matrix[1:]))[::-1] return res
class Solution: def spiralOrder(self , matrix: List[List[int]]) -> List[int]: # 拓宽visit矩阵的纬度,使得已访问检测和矩阵超界检测统一 seq = [] if len(matrix) == 0: return matrix if len(matrix) == 1: return matrix[0] visit = [[0 for _ in range(len(matrix[0])+2)] for _ in range(len(matrix)+2)] for i in range(len(visit[0])): # 遍历列 visit[0][i] = 1 visit[len(visit)-1][i] = 1 for i in range(len(visit)): # 遍历行 visit[i][0] = 1 visit[i][len(visit[0])-1] = 1 curDir = 'right' i = j = 1 changeTimes = 0 while True: if changeTimes == 2: break if not visit[i][j]: # dir unchange visit[i][j] = 1 seq.append(matrix[i-1][j-1]) i, j = self.nextInd(i, j, curDir) changeTimes = 0 else: # dir change # 退回上一步, 改变方向 i, j = self.preInd(i, j, curDir) curDir = self.changeDir(curDir) i, j = self.nextInd(i, j, curDir) changeTimes += 1 return seq def nextInd(self, i, j, curDir): if curDir == 'down': i += 1 elif curDir == 'up': i -=1 elif curDir == 'right': j += 1 elif curDir == 'left': j -= 1 return i, j def preInd(self, i, j, curDir): if curDir == 'down': i -= 1 elif curDir == 'up': i +=1 elif curDir == 'right': j -= 1 elif curDir == 'left': j += 1 return i, j def changeDir(self, curDir): if curDir == 'right': return 'down' elif curDir == 'down': return 'left' elif curDir == 'left': return 'up' elif curDir == 'up': return 'right'
# # # @param matrix int整型二维数组 # @return int整型一维数组 # https://blog.csdn.net/thmx43/article/details/116738360?ops_request_misc=&request_id=&biz_id=102&utm_term=pythonnc38%20%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187 class Solution: def spiralOrder(self , matrix ): # write code here result = [] if matrix == [] : return result m = len(matrix) n = len(matrix[0]) up = 0 down = m -1 left = 0 right = n - 1 x,y = 0,0 ff = 1 if n == 1 : ff = 2 for i in range(m*n) : tmp = matrix[x][y] result.append(tmp) if ff == 1 : y += 1 if y == right : up += 1 ff = 2 continue elif ff == 2 : x += 1 if x == down : right -= 1 ff = 3 continue elif ff == 3 : y -= 1 if y == left : down -= 1 ff = 4 continue elif ff == 4 : x -= 1 if x == up : left += 1 ff = 1 continue return result
# 方法很蠢,但是结构上还是比较清晰的 class Solution: def spiralOrder(self , matrix ): # write code here if not matrix: return [] left = 0 right = len(matrix[0]) up = 0 down = len(matrix) res = [] direction = 0 while left < right and up < down: direction %= 4 if direction == 0: for i in range(left,right): res.append(matrix[up][i]) up += 1 direction += 1 elif direction == 1: for j in range(up,down): res.append(matrix[j][right-1]) right -= 1 direction += 1 elif direction == 2: for i in range(right-1,left-1,-1): res.append(matrix[down-1][i]) down -= 1 direction += 1 elif direction == 3: for j in range(down-1, up-1, -1): res.append(matrix[j][left]) left += 1 direction += 1 return res
#解法一:方向模拟 # # @param matrix int整型二维数组 # @return int整型一维数组 # class Solution: def spiralOrder(self , matrix ): # write code here ''' 想实现螺旋遍历,有两种思路: 1. 按方向进行模拟:定义四个方向,一旦发生越界或下一个即将访问的位置已被访问过则转向 2.按形状进行模拟:一圈一圈的进行遍历,先遍历外圈再遍历内圈。 ''' if len(matrix)==0:return [] opt = [ [0,1], [1,0], [0,-1], [-1,0] ] x,y,p = 0,0,0 m,n = len(matrix),len(matrix[0]) ans = [] for i in range(m*n): ans.append(matrix[x][y]) matrix[x][y] = '#' nx,ny = x+opt[p][0],y+opt[p][1] if nx < 0&nbs***bsp;nx >= m&nbs***bsp;ny <0&nbs***bsp;ny >= n&nbs***bsp;matrix[nx][ny] == '#': p = (p+1)%len(opt) nx,ny = x+opt[p][0],y+opt[p][1] x,y = nx,ny return ans #解法二:形状模拟 # # @param matrix int整型二维数组 # @return int整型一维数组 # class Solution: def spiralOrder(self , matrix ): # write code here ''' 想实现螺旋遍历,有两种思路: 1. 按方向进行模拟:定义四个方向,一旦发生越界或下一个即将访问的位置已被访问过则转向 2.按形状进行模拟:一圈一圈的进行遍历,先遍历外圈再遍历内圈。 ''' ans = [] def circle(x1,x2,y1,y2): if x2 < x1 or y2 < y1:return if x1 == x2: for i in range(y1,y2+1):ans.append(matrix[x1][i]) return if y1 == y2: for i in range(x1,x2+1):ans.append(matrix[i][y2]) return for i in range(y1,y2):ans.append(matrix[x1][i]) for i in range(x1,x2):ans.append(matrix[i][y2]) for i in range(y2,y1,-1):ans.append(matrix[x2][i]) for i in range(x2,x1,-1):ans.append(matrix[i][y1]) circle(x1+1, x2-1, y1+1, y2-1) if len(matrix)==0:return [] circle(0, len(matrix)-1, 0,len(matrix[0])-1) return ans