【无标题】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
相关推荐
余额瞒着我当琳3 小时前
C++多态深入解析:多态概念,多态实现条件,虚函数表与内存分布,常见问题及注意事项
c++·算法
维克兜率天3 小时前
【维克】模块3总结:从一行空数据,到一个能跑的模型
python·深度学习·算法
飞Link3 小时前
定积分理论与 Python 仿真完全指南
python·算法
闲研随记4 小时前
RL算法学习:ArgMaxRL
算法·llm·强化学习·rl
飞Link4 小时前
零基础:离散数据积分与 Python 实现保姆级教程
python·算法
淡海水4 小时前
11-03-Unity-List-T-和Dictionary-TKey-TValue-的性能调优实战
算法·unity·c#·list·dictionary
土司大王4 小时前
LeetCode hot100——394.字符串解码:Java 双栈模拟
java·算法·leetcode
a187927218314 小时前
【算法】双指针与滑动窗口(三):相向双指针——比较、排除、收缩
算法·leetcode·双指针·滑动窗口·原理·相向双指针·算法讲解
AI 小老六5 小时前
Agent 记忆系统难在取舍
人工智能·算法·架构·agent·memory·harness