给你一个mn列的矩阵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

解1 2021/9/8 O(n)

def spiralOrder(matrix: list) -> list:
    # 题目限制了mxn,m和n>=1
    '''
        0   1   2   3
        -------------
    0  |1   2   3   4
    1  |4   5   6   7
    2  |7   8   9   3

    →   ↓   ←   ↑   循环,直到填完n个数为止
    同时更新上下左右四面墙就行了
    比如,初始的时候,
    zuo=0,you=3,shang=0,xia=2
    →完了,shang+=1
    ↓完了,you-=1
    ←完了,xia-=1
    ↑完了,zuo+=1
    '''
    m=matrix.__len__()
    n=matrix[0].__len__()
    zuo=0
    you=n-1
    shang=0
    xia=m-1
    res=[]
    i=0
    num_nr=m*n
    while i<num_nr:
        # →
        for x in range(zuo,you+1):
            res.append(matrix[shang][x])
            i+=1
            if i==num_nr: return res
        shang+=1
        # ↓
        for x in range(shang,xia+1):
            res.append(matrix[x][you])
            i+=1
            if i == num_nr: return res
        you-=1
        # ←
        for x in range(you,zuo-1,-1):
            res.append(matrix[xia][x])
            i+=1
            if i == num_nr: return res
        xia-=1
        # ↑
        for x in range(xia,shang-1,-1):
            res.append(matrix[x][zuo])
            i+=1
            if i == num_nr: return res
        zuo+=1
    return res

if __name__ == '__main__':
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    print(spiralOrder(matrix))
    matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
    print(spiralOrder(matrix))
    matrix = [[1, 2], [5, 6], [8, 9]]
    print(spiralOrder(matrix))
    matrix = [[1, 2,3], [2,5, 6]]
    print(spiralOrder(matrix))
    matrix = [[1]]
    print(spiralOrder(matrix))
    matrix = [[1,2,3,3,4]]
    print(spiralOrder(matrix))
    matrix = [[1],[2],[3],[3],[4]]
    print(spiralOrder(matrix))

Leetcode - 54. 螺旋矩阵_商业