LeetCode54. 螺旋矩阵(python)

54. 螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7] 

解题思路: 

首先顺时针读取矩阵最外围的元素;

接着从(1,1)开始遍历矩阵,开始判断元素“行走”的方向:上方和左侧元素为0,右侧元素不为0时,右行一格(走过的格子元素均为0,下同);上方和右侧元素为0,下方元素不为0时,下行一格;右侧和下方元素为0,左侧元素不为0时,左行一格;下方和左侧元素为0,上方元素不为0时,上行一格;当上下左右4个元素均为0时,跳出循环。

接着就是LeetCode最烦人的特殊情况的处理:矩阵为空,矩阵为1行,矩阵为1列,这些情况代码都写得很清楚;单独说一下,在读取完外围一圈元素时,判断一下:如果行数或列数为2,则直接返回。

代码:

class Solution:
    def spiralOrder(self, matrix):
        if len(matrix) == 0:
            return []
        width = len(matrix)
        length = len(matrix[0])
        num = []
        if width == 1 :
            return matrix[0]
        if length == 1:
            for j in range(width):
                num.append(matrix[j][0])
            return num

        for x in range(0, length):
            num.append(matrix[0][x])
            matrix[0][x] = 0
        for y in range(1, width):
            num.append(matrix[y][length-1])
            matrix[y][length-1] = 0
        for x in range(length-2, -1 ,-1):
            num.append(matrix[width-1][x])
            matrix[width-1][x] = 0
        for y in range(width-2, 0, -1):
            num.append(matrix[y][0])
            matrix[y][0] = 0
        
        if length == 2 or width ==2:
            return num
        x, y = 1, 1
        while True:
            if matrix[x-1][y] == 0 and matrix[x][y-1] == 0 and matrix[x][y+1] != 0:
                num.append(matrix[x][y])
                matrix[x][y] = 0
                y+=1
            if matrix[x-1][y] == 0 and matrix[x][y+1] == 0 and matrix[x+1][y] != 0:
                num.append(matrix[x][y])
                matrix[x][y] = 0
                x+=1
            if matrix[x][y+1] == 0 and matrix[x+1][y] == 0 and matrix[x][y-1] != 0:
                num.append(matrix[x][y])
                matrix[x][y] = 0
                y-=1
            if matrix[x+1][y] == 0 and matrix[x][y-1] == 0 and matrix[x-1][y] != 0:
                num.append(matrix[x][y])
                matrix[x][y] = 0
                x-=1
            if matrix[x-1][y] == 0 and matrix[x][y-1] == 0 and matrix[x][y+1] == 0 and matrix[x+1][y] == 0:
                num.append(matrix[x][y])
                break
                
        return num

猜你喜欢

转载自blog.csdn.net/qq_43235359/article/details/88711897