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

题目信息

给你一个 m 行 n 列的矩阵 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
相关推荐
一去不复返的通信er6 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
程序 代码狂人9 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade9 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
小郎君65811 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
邵奈一12 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS10012 小时前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
shehuiyuelaiyuehao12 小时前
算法56,重排链表
数据结构·算法·链表
qq_4523962313 小时前
第四篇:《索引原理与实战:B-tree、Hash、GIN、GiST、BRIN》
算法·哈希算法·gin
西索斯coding13 小时前
Qwen3-Max 与 Qwen-Plus:60 个真实修复任务评测方案
大数据·网络·算法·ai