【无标题】LeetCode hot 100 —54. 螺旋矩阵

题目信息

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 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]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

自写代码和思考

感觉做过啊感觉做过啊,之前练习csp的时候或者刷acwing的时候绝对做过类似的题目,这里直接可以手写一个版本,自写版本如下:

python 复制代码
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        res = []
        # 感觉刷CSP的时候遇到过类似的题目...
        # 先确定方向, 方向是先向右------>向下------>向左------>向上;然后往复
        bias = [[0, 1], [1, 0], [0, -1], [-1, 0]]
        m = len(matrix)
        n = len(matrix[0])
        boundarys = [n - 1, m - 1, 0, 0]  # 四个方向的边界,和bias对齐(右、下、左、上)
        boundary_bias = [-1, -1, 1, 1]  # 到达边界以后的移动方向
    
        pos = 0 # 记录当前的方向
        i, j = 0, 0
        while len(res) < m * n:
            while j <= boundarys[0] and i <= boundarys[1] and j >= boundarys[2] and i >= boundarys[3]:  #合法范围内
                res.append(matrix[i][j])
                i = i + bias[pos][0]
                j = j + bias[pos][1]
            # 需要变化方向
            boundarys[pos] += boundary_bias[pos]  # 首先更新边界
            # 回退回最后一个合法的位置
            i = i - bias[pos][0]
            j = j - bias[pos][1] 
        
            pos += 1 #变化方向
            pos %= 4
            #往正确方向移动一步, 这是新方向上的首个未加入res的合法位置
            i = i + bias[pos][0]
            j = j + bias[pos][1]
        return res

运行超时,但是自己也排查出逻辑错误了,重点在边界更新这里。

当到达右边界的时候,应该更新的是右边界吗?

不是的,接下来的方向是始终维持在该右边界向下移动的,如果改变了反而导致循环一直卡死在res的计数上面,所以这里有一个更新的逻辑错误。

到达右边界,更改的应该是上边界,此时已经扫完顶部的一行;

同理,到达下边界,更改的应该是右边界,因为最右侧的一列已经被扫完。依此类推..

修订后通过代码

修改边界更新规则就可以了

python 复制代码
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        res = []
        # 感觉刷CSP的时候遇到过类似的题目...
        # 先确定方向, 方向是先向右------>向下------>向左------>向上;然后往复
        bias = [[0, 1], [1, 0], [0, -1], [-1, 0]]
        m = len(matrix)
        n = len(matrix[0])
        boundarys = [n - 1, m - 1, 0, 0]  # 四个方向的边界,和bias对齐(右、下、左、上)
    
        pos = 0 # 记录当前的方向
        i, j = 0, 0
        while len(res) < m * n:
            while j <= boundarys[0] and i <= boundarys[1] and j >= boundarys[2] and i >= boundarys[3]:  #合法范围内
                res.append(matrix[i][j])
                i = i + bias[pos][0]
                j = j + bias[pos][1]
            # 需要变化方向
            # 更新边界
            if pos == 0: boundarys[3] += 1 # 向右走完,排除顶部
            elif pos == 1: boundarys[0] -= 1    # 向下走完,排除右侧
            elif pos == 2: boundarys[1] -= 1    # 向左走完,排除底部
            else: boundarys[2] += 1     # 向上走完,排除左侧
            # 回退回最后一个合法的位置
            i = i - bias[pos][0]
            j = j - bias[pos][1] 
        
            pos += 1 #变化方向
            pos %= 4
            #往正确方向移动一步, 这是新方向上的首个未加入res的合法位置
            i = i + bias[pos][0]
            j = j + bias[pos][1]

        return res
相关推荐
ai产品老杨1 小时前
越界检测算法接入 AI 视频分析平台的流程与误报优化指南
人工智能·算法·音视频
bluesky9612221 小时前
malloc 和 realloc C/C++
c语言·c++·算法
M78佐菲1 小时前
Linux学习笔记:进程回收、exec函数簇与线程
linux·笔记·学习·算法
linux-hzh1 小时前
百日算法修炼 · Day 18
算法
用户813267933251 小时前
Python 计算盘中 VWAP:为什么 1 分钟 K 线是量化工程中的高性价比选择
后端·算法·github
高频因子挖掘机2 小时前
Python批量获取1000只ETF 5分钟K线:从分页到吞吐量优化的QuantDash实践
后端·算法·github
额额额对了2 小时前
Linux C 多线程编程基础:从内存模型到生命周期管理
linux·开发语言·算法
wabs6662 小时前
关于二叉树【力扣144.二叉树的前序遍历的思考】
数据结构·c++·算法·leetcode·二叉树
郝学胜-神的一滴3 小时前
C++20 高级编程 004:从初始化、内存到const系列关键字
开发语言·算法·编程·软件构建·c++20