力扣:54. 螺旋矩阵(Python3)

题目:

给你一个 mn 列的矩阵 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,修改状态切换后的首位置。

代码:

python 复制代码
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
相关推荐
深蓝海拓7 分钟前
QT,sys.argv支持的核心内置参数
python·pyqt
superman超哥8 分钟前
仓颉语言中循环语句(for/while)的深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
冷雨夜中漫步12 分钟前
Java类加载机制——双亲委派与自定义类加载器
java·开发语言·python
xlq2232220 分钟前
29.哈希(下)
算法·哈希算法·散列表
阿昭L20 分钟前
leetcode链表是否有环
算法·leetcode·链表
拾忆,想起24 分钟前
单例模式深度解析:如何确保一个类只有一个实例
前端·javascript·python·微服务·单例模式·性能优化·dubbo
癫狂的兔子28 分钟前
【Python】【NumPy】学习笔记
python·学习·numpy
yaoh.wang29 分钟前
力扣(LeetCode) 83: 删除排序链表中的重复元素 - 解法思路
程序人生·算法·leetcode·链表·面试·职场和发展
阿昭L34 分钟前
leetcode旋转链表
算法·leetcode·链表
山楂树の34 分钟前
有效的括号(栈)
数据结构·算法