LeetCode 54. Spiral Matrix

简介: 给定m×n个元素的矩阵(m行,n列),以螺旋顺序[顺时针]返回矩阵的所有元素

image.png

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]


描述



给定m×n个元素的矩阵(m行,n列),以螺旋顺序[顺时针]返回矩阵的所有元素


思路



v2-1fbf9a753be135507a566a806e08b636_720w.jpg


  • 如上图,此题目同第48题Rotate Image做法非常类似,原题目在这里,解析在这里.
  • 同样如上图,我们维护四个变量:rowtop, coleft, rowbot, colright,分别表示第一行行索引,第一列列索引,最后一行行索引,最后一列列索引
  • 然后我们按照先从左至右取第一行的每个元素,然后从上至下取最后列的每一个元素,然后从右至左取最后一列的每一个元素,最后从下往上取第一列的每一个元素
  • 每一圈就是一个while循环,也就是一层,我们一层一层的取,直到最后一层
  • 需要注意的是如果矩阵只剩下一列或者只剩下一行我们需要单独拿出来取值,因为如果此时仍然放在while循环中,会导致这一行的元素别被重复取


class Solution:
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        # 如果矩阵为空,直接返回空
        if not matrix:
            return []
        # 结果数组,用来保存最终答案
        res = []
        # row表示行数,col表示列数
        row, col = len(matrix), len(matrix[0])
        # 第一行行索引,第一列列索引,最后一行行索引,最后一列列索引
        rowtop, coleft, rowbot, colright = 0, 0, row-1, col - 1
        # 循环条件,当矩阵剩余不止一行且不止一列时,才进行循环
        while rowbot > rowtop and coleft < colright:
            # 取第一行
            for i in range(coleft, colright):
                res.append(matrix[rowtop][i])
            # 取最后一列
            for i in range(rowtop, rowbot):
                res.append(matrix[i][colright])
            # 取最后一行
            for i in range(colright, coleft, -1):
                res.append(matrix[rowbot][i])
            # 取第一列
            for i in range(rowbot, rowtop, -1):
                res.append(matrix[i][coleft])
            # 第一行字减一次,进入下一行
            rowtop += 1
            # 最后一行自减一次,进入上一行
            rowbot -= 1
            # 第一列自减一次,进入第二列
            coleft += 1
            # 最后一列自减一次,进入前一列
            colright -= 1
        # 如果最后还剩一行
        if rowtop == rowbot:
            for i in range(coleft, colright+1):
                res.append(matrix[rowtop][i])
        # 如果最后还剩一列
        elif coleft == colright:
            for i in range(rowtop, rowbot+1):
                res.append(matrix[i][coleft])
        return res


源代码文件在这里.

目录
相关文章
Leetcode 74. Search a 2D Matrix
这道题很简单,为此专门写篇博客其实算博客凑数了。给你一个每一行每一列都是增序,且每一行第一个数都大于上一行末尾数的矩阵,让你判断某个数在这个矩阵中是否存在。 假设矩阵是m*n,扫一遍的时间复杂度就是O(m*n),题目中给出的这么特殊的矩阵,时间复杂度可以降到O(m+n),具体代码如下,写的比较挫。
83 1
Leetcode 240. Search a 2D Matrix II
具体思路就是每一行倒着扫,扫到第一个比target小的数就跳到下行,如果等于当然是直接返回true了,如果下一行还比target小就继续跳下一行,直到最后一行。 为啥这么做是可行的? 可能我比较笨,想了半天才想到。 因为每一列都是增序的,举个例子,假设matrix[0][5] > target,那么[0][5]位置右下(包含右和下)所有元素不可能比target小。
46 0
|
Python
LeetCode 378. Kth S Element in a Sorted Matrix
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。 请注意,它是排序后的第k小元素,而不是第k个元素。
106 0
LeetCode 378. Kth S Element in a Sorted Matrix
|
存储
LeetCode 329. Longest Increasing Path in a Matrix
给定一个整数矩阵,找出最长递增路径的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
70 0
LeetCode 329. Longest Increasing Path in a Matrix
|
算法
LeetCode 240. Search a 2D Matrix II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。
81 0
LeetCode 240. Search a 2D Matrix II
|
算法
LeetCode 74. Search a 2D Matrix
编写一个有效的算法,搜索m×n矩阵中的值。 此矩阵具有以下属性: 每行中的整数从左到右排序. 每行的第一个整数大于前一行的最后一个整数.
79 0
LeetCode 74. Search a 2D Matrix
|
存储 索引
LeetCode 73. Set Matrix Zeroes
给定一个m * n 的矩阵,如果当前元是0,则把此元素所在的行,列全部置为0. 额外要求:是否可以做到空间复杂度O(1)?
101 0
LeetCode 73. Set Matrix Zeroes
LeetCode 1380. 矩阵中的幸运数 Lucky Numbers in a Matrix
LeetCode 1380. 矩阵中的幸运数 Lucky Numbers in a Matrix
LeetCode 5340. 统计有序矩阵中的负数 Count Negative Numbers in a Sorted Matrix
LeetCode 5340. 统计有序矩阵中的负数 Count Negative Numbers in a Sorted Matrix
LeetCode 59. Spiral Matrix II
给定正整数n,以螺旋顺序生成填充有从1到n2的元素的方阵。
90 0