【无标题】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
相关推荐
飘尘2 小时前
从"算子"到"AI Infra":大模型背后看不见的那群人在忙什么
人工智能·算法·面试
夏幻灵2 小时前
每日一题:LeetCode 3:无重复字符的最长子串——滑动窗口思路详解
算法·leetcode·职场和发展
CarIise3 小时前
Java实训阶段查漏补缺复习笔记2
java·linux·算法
无忧.芙桃3 小时前
C++ 并查集详解:原理、实现与应用
c语言·c++·算法·leetcode
蛋蛋的就会顺顺的3 小时前
hot100——二叉树
java·数据结构·算法·leetcode·力扣
Code_Solitude4 小时前
c语言:二分法的完整补充
c语言·开发语言·算法
一切皆是因缘际会4 小时前
掌控信息论:同源星际通信基础理论
人工智能·算法·ai
动词ing6 小时前
【C语言题目练习】算法 整数反转
c语言·开发语言·算法
Nil2086 小时前
leetcode 55跳跃游戏
算法·leetcode·游戏
longlongzihan6 小时前
LeetCode 128. 最长连续序列 —— 从排序到哈希集合
数据结构·c++·算法·leetcode·排序算法·哈希表