给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
数据范围:
,矩阵中任意元素都满足
要求:空间复杂度
,时间复杂度 )
# @param matrix int整型二维数组 # @return int整型一维数组 # class Solution: def spiralOrder(self, matrix): # write code here # 利用python中的zip函数 # res = [] # while matrix: # res += matrix[0] # matrix = list(zip(*matrix[1:]))[::-1] # return res rn = len(matrix) if rn == 0: res = [] elif isinstance(matrix[0], int): res = matrix else: res = [] while matrix: res.extend(matrix[0]) matrix = self.rotate_matrix(matrix[1:]) print(res) print("res:", res) return res def rotate_matrix(self, matrix): """ 矩阵旋转通用函数 :param matrix: :return: """ rn = len(matrix) if rn == 0: return matrix if isinstance(matrix[0], int): return matrix cn = len(matrix[0]) print(rn, cn) r_matrix = [[0]*rn for i in range(cn)] #初始化逆时针旋转矩阵的大小 for r in range(rn): for c in range(cn): # 逆时针旋转90度 r_matrix[cn-c-1][r] = matrix[r][c] # 45度对角线翻转 # r_matrix[cn-c-1][rn-r-1] = matrix[r][c] # 顺时针旋转90度 # r_matrix[c][rn-r-1] = matrix[r][c] print(r_matrix) return r_matrix
# # # @param matrix int整型二维数组 # @return int整型一维数组 # class Solution: def spiralOrder(self , matrix ): # write code here # 测试用例里面有空矩阵 if not matrix: return [] # 获取m行 m = len(matrix) # 获取n列 n = len(matrix[0]) # 定义扫描方向 # 行的扫描方向 正向扫描、停止扫描、逆向扫描、停止扫描 step_col = [1,0,-1,0] # 列的扫描方向 停止扫描,正向扫描、停止扫描、逆向扫描 step_raw = [0,1,0,-1] # 扫描方向坐标 step = 0 # 行列的起始坐标 col_index=raw_index=0 result = [] for i in range(n*m): result.append(matrix[raw_index][col_index]) # 打上已扫描的标签-“v” matrix[raw_index][col_index] = 'v' # 下一步的坐标 tmp_col = col_index + step_col[step] tmp_raw = raw_index + step_raw[step] # 如果未到达边际,继续扫描 if 0<=tmp_col<n and 0<=tmp_raw<m and matrix[tmp_raw][tmp_col]!='v': col_index = tmp_col raw_index = tmp_raw else: # 到达边际,通过改变扫描坐标来改变扫描方向 step = (step+1)%4 col_index += step_col[step] raw_index += step_raw[step] return result
# # # @param matrix int整型二维数组 # @return int整型一维数组 # class Solution: def spiralOrder(self , matrix ): # write code here if len(matrix) == 0: return [] if len(matrix) == 1: return matrix[0] if len(matrix[0]) == 1: return list(map(list, zip(*matrix)))[::-1][0] res = [] temp = matrix while len(temp) > 2: res = res + temp[0] temp = temp[1:] temp = list(map(list, zip(*temp)))[::-1] # roted res = res + temp[0] + list(reversed(temp[1])) return res
python写的两种解法,思路是一样的,主要是避免重复存储的方法不同,欢迎指正!
""" 思路1: 1.从左到右:i=[left,right], matrix[top][i] 2.从上到下:i=[top+1,bottom], matrix[i][right] 3.从右到左:i=[right-1,left], matrix[bottom][i] 4.从下到上:i=[bottom-1,top+1], matrix[i][right] 注意:如何避免重复存储!采用边界条件来控制存储! """ class Solution: def spiralOrder(self , matrix ): res = [] if len(matrix) == 0: return res top, left = 0, 0 bottom = len(matrix) - 1 right = len(matrix[0]) - 1 while top <= bottom and left <= right: # 1.从左到右:i=[left,right], matrix[top][i] for i in range(left,right+1): res.append(matrix[top][i]) # 2.从上到下:i=[top+1,bottom], matrix[i][right] for i in range(top+1,bottom+1): res.append(matrix[i][right]) # 3.从右到左:i=[right-1,left], matrix[bottom][i] if top != bottom: # 只剩一行时候,前面已经存储过,这里不再存储; for i in range(right-1,left-1,-1): res.append(matrix[bottom][i]) # 4.从下到上:i=[bottom-1,top+1], matrix[i][right] if left != right: # 只剩一列时候,前面已经存储过,这里不再存储; for i in range(bottom-1,top,-1): res.append(matrix[i][left]) top += 1 right -= 1 bottom -= 1 left += 1 return res """ 思路2: 1.从左到右:i=[left,right], matrix[top][i] 2.从上到下:i=[top+1,bottom], matrix[i][right] 3.从右到左:i=[right-1,left], matrix[bottom][i] 4.从下到上:i=[bottom-1,top+1], matrix[i][right] 注意:如何避免重复存储!计算一共存储了多少个元素。 """ class Solution: def spiralOrder(self , matrix ): res = [] if len(matrix) == 0: return res top, left = 0, 0 bottom = len(matrix) - 1 right = len(matrix[0]) - 1 num = (bottom+1) * (right+1) while num > 0: # 判断全部元素是否存储完毕 # 1.从左到右:i=[left,right], matrix[top][i] for i in range(left,right+1): if num > 0: res.append(matrix[top][i]) num -= 1 # 2.从上到下:i=[top+1,bottom], matrix[i][right] for i in range(top+1,bottom+1): if num > 0: res.append(matrix[i][right]) num -= 1 # 3.从右到左:i=[right-1,left], matrix[bottom][i] for i in range(right-1,left-1,-1): if num > 0: res.append(matrix[bottom][i]) num -= 1 # 4.从下到上:i=[bottom-1,top+1], matrix[i][right] for i in range(bottom-1,top,-1): if num > 0: res.append(matrix[i][left]) num -= 1 top += 1 right -= 1 bottom -= 1 left += 1 return res
# # # @param matrix int整型二维数组 # @return int整型一维数组 # class Solution: def printMatrixCircle(self,matrix,rows,cols,start,totallist): endx=cols-start endy=rows-start for i in range(start,endx+1): totallist.append(matrix[start][i]) if endy>start: for i in range(start+1,endy+1): totallist.append(matrix[i][endx]) if(start<endx and start<endy): for i in range(endx-1,start-1,-1): totallist.append(matrix[endy][i]) if(start<endx and start<endy-1): for i in range(endy-1,start,-1): totallist.append(matrix[i][start]) def spiralOrder(self , matrix ): # write code here if matrix==[]: return [] rows=len(matrix) cols=len(matrix[0]) if rows<=0&nbs***bsp;cols<=0: return [] if rows==1: temlist=[i for i in matrix[0]] return temlist start=0 totallist=[] while(cols>start*2 and rows>start*2): self.printMatrixCircle(matrix,rows-1,cols-1,start,totallist) start+=1 return totallist