题目:
给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。来源:力扣(LeetCode)
链接:力扣
示例:
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
解法:
以顺时针螺旋遍历二维列表,将每次遍历到的元素存到result。首先,初始化row为len(matrix) - 1,表示最大行,初始化col为len(matrix[0]) - 1,表示最大列,初始化rh为1,表示行的起始位置为1,初始化ch为0,表示列的起始位置为1,初始化r、c为0,表示当前位置,初始化flag为1,表示当前状态。
一共有4种状态,第1种是从左到右遍历,第2种是从上到下遍历,第3种是从右到左遍历,第4种是从下到上遍历。遍历的总次数是元素的个数,4种状态循环切换,直到遍历完,以下以第1种状态为例,第2、3、4种状态同理。
进入第1种状态,首先将根据r、c把当前位置的值添加到result,然后判断是否走到最右边,注意,最右边指的是没有遍历的元素的最右边,通过col判断,如果没到最右边,则c自增1,如果到了,需要切换状态,并且将col自减1,表示缩小下次可遍历到的最右边,即去除已遍历元素,将r自增1,修改状态切换后的首位置。
代码:
class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:result = []row = len(matrix) - 1col = len(matrix[0]) - 1rh = 1ch = 0flag = 1r = c = 0for _ in range((row + 1) * (col + 1)):if flag == 1:result.append(matrix[r][c])if c == col:col -= 1r += 1flag = 2else:c += 1elif flag == 2:result.append(matrix[r][c])if r == row:row -= 1c -= 1flag = 3else:r += 1elif flag == 3:result.append(matrix[r][c])if c == ch:ch += 1r -= 1flag = 4else:c -= 1else:result.append(matrix[r][c])if r == rh:rh += 1c += 1flag = 1else:r -= 1return result