[牛客笔记] NC38 螺旋矩阵金牌代码解析 Python

描述
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
示例1
输入:

[[1,2,3],[4,5,6],[7,8,9]]

返回值:

[1,2,3,6,9,8,7,4,5]

分析:
本题时间空间限制较为宽松,用模拟系统的直觉的方法来做也能AC。
但排行第一的代码更为巧妙。
![在这里插入图片描述](https://img-blog.csdnimg.cn/734f750b16f8486dbaa51615e7ab7a7c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rGf5Y2X6Jyh56yU5bCP5paw,size_16,color_FFFFFF,t_70,g_se,x_16

以题目中[[1,2,3],[4,5,6],[7,8,9]]为例
class Solution:
    def spiralOrder(self , matrix ):
        # write code here
        res = []
        while matrix:
            res += matrix[0]
            matrix = list(zip(*matrix[1:]))[::-1]
        return res

初始状态为:
1 2 3
4 5 6
7 8 9
第一次循环,
res += matrix[0] -> res=[1,2,3]
此时,根据zip的特性:
会重新打包得到这样一个list:[(4, 7), (5, 8), (6, 9)]
切片将其转为: [(6, 9), (5, 8), (4, 7)]

第二次循环,
res += matrix[0] -> res=[1,2,3]
这里需要注意一个知识点:
假设a为列表,b为元组
那么a+b的操作是不被允许的
但a+=b是合法的,究其原因,大该是会自动将b推导为list以实现两个列表相加

zip后[(5, 4), (8, 7)]
反转后: [(8, 7), (5, 4)]

后面的以此类推,不再列出

该代码的精妙之处在于:

  1. 利用zip完成方向上的变化
  2. 利用切片翻转来满足顺序上的要求

很难想到,记在这里,等于我会了

猜你喜欢

转载自blog.csdn.net/ftimes/article/details/120273069