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
python 复制代码
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        left,right,top,below=0,len(matrix[0])-1,0,len(matrix)-1
        res=[]
        while True:
            for i in range(left,right+1): res.append(matrix[top][i])
            top+=1
            if top>below: break
            for i in range(top,below+1): res.append(matrix[i][right])
            right-=1
            if left>right: break
            for i in range(right,left-1,-1): res.append(matrix[below][i])
            below-=1
            if top>below: break
            for i in range(below,top-1,-1): res.append(matrix[i][left])
            left+=1
            if left>right: break
        return res
        

主要思想是设立上下左右四个边界,根据边界打印,打印完之后边界向内收缩1,表示已打印,如果边界相遇说明打印已完成。

首先在第一行开始从左到右打印,打印完第一行之后,上边界下移,也就是top加一,然后从上边界开始从上到下打印,打印完后右边界左移,然后从右边界从右到左打印,下边界上移,然后从下边界从下到上打印,一直如此循环。

打印行的时候只需要看上边界是否大于下边界,如果大于就退出,表示打印完了;同样打印列的时候看左边界是否大于右边界,大于就退出。

模拟过程:

假设矩阵是 3行3列:

复制代码
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

初始:l=0, r=2, t=0, b=2

第一轮循环:

  1. 从左到右:res.append(matrix[0][0..2])→ [1,2,3]

  2. t += 1→ t=1

  3. 从上到下:res.append(matrix[1..2][2])→ [1,2,3,6,9]

  4. r -= 1→ r=1

  5. 从右到左:res.append(matrix[2][1..0])→ [1,2,3,6,9,8,7]

  6. b -= 1→ b=1

  7. 从下到上:res.append(matrix[1..0][0])→ [1,2,3,6,9,8,7,4]

  8. l += 1→ l=1

此时边界:l=1, r=1, t=1, b=1

第二轮循环开始:

  1. 从左到右:res.append(matrix[1][1..1])→ [1,2,3,6,9,8,7,4,5]

  2. t += 1→ t=2

  3. 检查 if t > b: break

    • 现在 t=2, b=1

    • 2 > 1成立 ✅

    • break 退出循环

相关推荐
青少儿编程课堂2 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
YSL07012432 分钟前
一文通关-----排序
数据结构·算法
ZhengEnCi11 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考11 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
夜不会漫长13 小时前
C++:红黑树
数据结构·算法
AI备案指南-满满14 小时前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
Ramble_Naylor14 小时前
Rust深度解读:Send 与 Sync 的本质与线程安全边界
python·算法·rust
秋天的怀念_David14 小时前
算法一千零一夜 · 第二十三夜 电力民生写成的曲线
java·程序人生·算法
不一样的故事12614 小时前
NB/T 47013.8-2015 附录D 吸枪技术
人工智能·经验分享·算法
通问AI14 小时前
用 200 行 Python 给文档库做「上下文完整度」自检:四个可复算的检查项
算法