【Leetcode 数组】 螺旋矩阵(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]

解答

像搜索一样,定义一个表示上下左右移动的数组。可代码量,哭辽...

z = [
            [0, 1],  # 右
            [1, 0],  # 下
            [0, -1],  # 左
            [-1, 0]  # 上
        ]

2020.5.30更新:不用定义移动数组,直接计算就OK。

(2020.5.30更新)代码实现:

class Solution:
    # Time: O(N),N为数值个数
    def spiralOrder(self, a):
        if not a:
            return []
        X, Y = len(a), len(a[0])
        x, y = 0, 0
        l = []

        while len(l) < X*Y:
            if a[x][y] != float('inf'):
                l.append(a[x][y])
                a[x][y] = float('inf')
            while y+1 < Y and a[x][y+1] != float('inf'):  # 向右
                y += 1
                l.append(a[x][y])
                a[x][y] = float('inf')
            while x+1 < X and a[x+1][y] != float('inf'):  # 向下
                x += 1
                l.append(a[x][y])
                a[x][y] = float('inf')
            while y-1 >= 0 and a[x][y-1] != float('inf'):  # 向左
                y -= 1
                l.append(a[x][y])
                a[x][y] = float('inf')
            while x-1 >= 0 and a[x-1][y] != float('inf'):  # 向上
                x -= 1
                l.append(a[x][y])
                a[x][y] = float('inf')
        return l


s = Solution()
ans = s.spiralOrder([[1, 2, 3, 4], 
                     [5, 6, 7, 8], 
                     [9, 10, 11, 12], 
                     [13, 14, 15, 16]
                     ])
print(ans)

# [1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
posted @ 2019-12-31 08:19  961897  阅读(213)  评论(0编辑  收藏  举报