题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
來源:力扣(LeetCode)
解题思路
1.剑指基本思路
建立边界条件 + 循环。从最外层开始,分成四步骤。
(a ) matrix、columns 与 rows 的个数,建立第一步至第四步的解法。
(b )设置边界条件,即:当 columns >2 and rows >2.
(c ) 边界条件以外的特殊案例,包含了四种情况(讨论如下),如输入一个 4x4矩阵,剩馀的会是最中间的 2x2 矩阵,符合额外条件讨论的第四种(IV)。
2.高级解法(参考别人的灵活解法)
每一次取 matrix 的 first row ,存进返回结果 res
,并且逆时针 90 度翻转,终止条件为 matrix 不存在时。
-
思路简化,代码行数较少,但是与方法一相比耗时较久。
-
由于下一组要取的 list 是 [6, 9]
- 使用 zip() 函数,将现有 list(*matrix) => [(4, 7), (5, 8), (6, 9) ]
- 并且翻转 List => [(6, 9), (5, 8), (4, 7)]
-
重复此动作,直到不存在 matrix
高级解法中的技巧笔记
-
List 翻转
- list.reverse()
- list[::-1]
順序相反操作
- list[2::-1]
順序相反操作,从index=2开始
- e.g. a = [1,2,3,4] ; a[2::-1] = [3,2,1]
-
zip 用法
- 将多个 List 当中的元素组成元组返回,当List长度不一的时候,元素个数与最短的列表一致
a = [ 1 , 2 , 3 ]
b = [ 4 , 5 , 6 ]
c = [ 4 , 5 , 6 , 7 , 8 ]
list(zip(a,b)) > [(1,4), (2,5), (3,6)]
list(zip(a,c)) > [(1,4), (2,5), (3,6)] -
List extend
- 当要合并两个 List 时可用
a = [1,2,4,5]
b = [3,5,6,7]
a.extend(b) > [1, 2, 4, 5, 3, 5, 6, 7]
Python 代码
# 按照剑指的基本思路
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not