[LeetCode] 54. Spiral Matrix

题:https://leetcode.com/problems/spiral-matrix/description/

题目

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

Example 1:

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

Example 2:

Input:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

思路

题目大意

从外围向中心,每圈顺时针遍历。

解题思路

1.顺时针遍历

分为两步,1.从外围到中心。2.确定要遍历矩形的坐标。

  1. 从外围到中心,表现为起始位置发生了变化。通过观察可以发现 其实位置为(start_p,start_p) ,其中start_p的取值从 0 –> (min(m,n)+1)//2 。

  2. 确定遍历的矩形。起始坐标为(start_p,start_p),边界为(m - 2*start_p,n - 2*start_p)。然后矩形上部,右部,下部,左部。其中遍历下部和左部前应该分辨判断 m - 2*start_p>1 ,n - 2*start_p>1。因为若该矩形只有一行,那 下部 和 上部 是有重复的,矩形的列也会出现这样的问题。

2.旋转矩形

    |1 2 3|      |6 9|      |8 7|      |4|  =>  |5|  =>  ||
    |4 5 6|  =>  |5 8|  =>  |5 4|  =>  |5|
    |7 8 9|      |4 7|

题目要求的遍历过程也可以视为,将矩阵第一行遍历后,将剩下的矩形左旋转180度。然后重复上述过程,直到矩形为空。
参考资料:https://leetcode.com/problems/spiral-matrix/discuss/20571/1-liner-in-Python-+-Ruby

python 能用一行来实现上述操作。

def spiralOrder(self, matrix):
    return matrix and [*matrix.pop(0)] + self.spiralOrder([*zip(*matrix)][::-1])

matrix :是判断 矩阵是否为空。
[*matrix.pop(0)]:pop操作是从最高维弹出,由于matrix是二维,所以弹出一个一维数组 。 星号能将 list,reduce降维。

[*zip(*matrix)][::-1]:zip可以实现将 list表示的 矩阵 转置。这个操作很难想到。再用[::-1] 调整举证列排序最终实现 将矩阵旋转 180度。

note:
星号 的 用法共有四种,参考:https://blog.csdn.net/yilovexing/article/details/80577510

code

1.顺时针遍历

class Solution:

    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        self.res = []
        m = len(matrix)
        if m == 0:
            return  self.res
        n = len(matrix[0])

        halfOfMinRadius_matrix = (min(m, n) + 1 )// 2
        for k in range(halfOfMinRadius_matrix):
            self.visitedRectangle(k, k, m - 2 * k, n - 2 * k, matrix)
        return self.res

    def visitedRectangle(self, start_row, start_col, m, n, matrix):
        for j in range(n):
            self.res.append(matrix[start_row][start_col + j])
        for i in range(1,m):
            self.res.append(matrix[start_row + i][start_col + n - 1])
        if m>1:
            for j in range(n - 2, -1, -1):
                self.res.append(matrix[start_row + m - 1][start_col + j])
        if n>1:
            for i in range(m - 2, 0, -1):
                self.res.append(matrix[start_row + i][start_col])

2.旋转矩形

class Solution:
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        return matrix and [*matrix.pop(0)] + self.spiralOrder([*zip(*matrix)][::-1])

猜你喜欢

转载自blog.csdn.net/u013383813/article/details/82657015