题目:
给你一个
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) - 1 col = len(matrix[0]) - 1 rh = 1 ch = 0 flag = 1 r = c = 0 for _ in range((row + 1) * (col + 1)): if flag == 1: result.append(matrix[r][c]) if c == col: col -= 1 r += 1 flag = 2 else: c += 1 elif flag == 2: result.append(matrix[r][c]) if r == row: row -= 1 c -= 1 flag = 3 else: r += 1 elif flag == 3: result.append(matrix[r][c]) if c == ch: ch += 1 r -= 1 flag = 4 else: c -= 1 else: result.append(matrix[r][c]) if r == rh: rh += 1 c += 1 flag = 1 else: r -= 1 return result