54. 螺旋矩阵 Spiral Matrix (Python3)

1. 题目

给你一个 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

2. 答案

直接利用递归的思想,考虑所有的边界条件,再考虑一次调用的case
边界条件:无论是行还是列,只有有一个为1或者2这一圈就可以把这个矩阵遍历完
一次调用的case:考虑矩阵的四条边界
具体的看代码:

from typing import List

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        tmp_res = []
        # 顺时针,先第一行
        i = 0
        for j in range(len(matrix[0])):
            tmp_res.append(matrix[i][j])
        # 最后一列
        j = len(matrix[0])-1
        for i in range(1, len(matrix)):
            tmp_res.append(matrix[i][j])
        # 最后一行
        if len(matrix)-1 != 0:
            i = len(matrix)-1
            for j in range(len(matrix[0])-2, -1, -1):
                tmp_res.append(matrix[i][j])
        # 第一列
        if len(matrix[0])-1 != 0:
            j = 0
            for i in range(len(matrix)-2, 0, -1):
                tmp_res.append(matrix[i][j])
        # 终止条件
        if len(matrix) == 1 or len(matrix) == 2 or len(matrix[0]) == 1 or len(matrix[0]) == 2:
            return tmp_res
        else:
            tmp_mat = matrix[1:-1]
            new_new_mat = []
            for i in tmp_mat:
                new_new_mat.append(i[1:-1])
            return tmp_res + self.spiralOrder(new_new_mat)
sol = Solution()
a_array = [[1,2,3],[4,5,6],[7,8,9]]
print(sol.spiralOrder(a_array))
### 螺旋矩阵算法概述 螺旋矩阵是指按照顺时针方向遍历二维数组中的元素,并将其按访问顺序排列成一维列表。对于一个 \(m \times n\)矩阵,目标是以特定路径读取其所有元素[^3]。 ### 实现逻辑 核心思想在于模拟沿四个边界移动的过程:向右、向下、向左以及向上。每次完成一圈后缩小范围继续处理内部子矩形直至全部元素被访问完毕[^4]。 ### 示例代码展示 下面给出一段基于上述原理编写的Python函数来解决这个问题: ```python def spiralOrder(matrix): result = [] while matrix: # 向右走一层 result += matrix.pop(0) if not matrix or not matrix[0]: break # 将剩余部分逆时针旋转90度 new_matrix = list(zip(*matrix))[::-1] matrix[:] = new_matrix return result ``` 此版本通过不断移除并加入最上层行到结果集中,随后对剩下的部分做变换操作以准备下一轮迭代[^2]。 另一种更直观的方式是直接控制上下左右四条边界的索引变化来进行逐层剥离式的扫描: ```python def spiral_order(matrix): res = [] top, bottom, left, right = 0, len(matrix)-1, 0, len(matrix[0])-1 while True: for i in range(left, right+1): # 左至右 res.append(matrix[top][i]) top += 1 if top > bottom: break for i in range(top, bottom+1): # 上至下 res.append(matrix[i][right]) right -= 1 if left > right: break for i in range(right, left-1, -1): # 右至左 res.append(matrix[bottom][i]) bottom -= 1 if top > bottom: break for i in range(bottom, top-1, -1): # 下至上 res.append(matrix[i][left]) left += 1 if left > right: break return res ``` 这段程序利用了四个变量分别记录当前正在处理区域的顶部、底部、左侧和右侧的位置,在每一步都更新这些界限值从而逐步逼近中心位置[^1]。 ### 性能考量 两种方法都能有效地解决问题,但在实际应用中后者通常具有更好的性能表现因为它避免了大量的内存拷贝操作(如`pop()` 和 `zip()`)。当面对大规模输入数据时这一点尤为重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值