力扣: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
相关推荐
深蓝海拓3 分钟前
PySide6,QCoreApplication::aboutToQuit与QtQore.qAddPostRoutine:退出前后的清理工作
笔记·python·qt·学习·pyqt
Sagittarius_A*6 分钟前
特征检测:SIFT 与 SURF(尺度不变 / 加速稳健特征)【计算机视觉】
图像处理·人工智能·python·opencv·计算机视觉·surf·sift
像风一样的男人@20 分钟前
python --读取psd文件
开发语言·python·深度学习
A尘埃25 分钟前
超市购物篮关联分析与货架优化(Apriori算法)
算法
薛定谔的猫喵喵28 分钟前
天然气压力能利用系统综合性评价平台:基于Python和PyQt5的AHP与模糊综合评价集成应用
开发语言·python·qt
.小墨迹32 分钟前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
yuluo_YX33 分钟前
Reactive 编程 - Java Reactor
java·python·apache
独好紫罗兰40 分钟前
对python的再认识-基于数据结构进行-a004-列表-实用事务
开发语言·数据结构·python
ZH154558913142 分钟前
Flutter for OpenHarmony Python学习助手实战:模块与包管理的实现
python·学习·flutter
不穿格子的程序员42 分钟前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心