【Leetcode】54. 合并K个升序链表(Spiral Matrix)

No54. 合并K个升序链表

题目

给定一个包含 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]

解题代码(Python3)

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        def getCol(up,down,index,type=0):
            data = matrix[up:down+1]
            if type == 0:
                return [x[index] for i,x in enumerate(data)]
            return [x[index] for i,x in enumerate(data) if i != 0 and i !=len(data)-1]
        #返回限定框的顺时针数据
        def getRound(left,right,up,down):
            if up == down:
                return matrix[up][left:right+1]
            if left == right:
                return getCol(up,down,left)
            return matrix[up][left:right+1] + getCol(up,down,right,1) + matrix[down][left:right+1][::-1] +getCol(up,down,left,1)[::-1]
        m = len(matrix)
        n = len(matrix[0])
        left = up = 0
        right = n - 1
        down = m - 1
        res = []
        while len(res) < m * n:
            res += getRound(left,right,up,down)
            up += 1
            down -= 1
            left += 1
            right -= 1
        return res

思路:

把矩形想象成一个箱子,沿着外壳逐层脱掉外壳,辅助变量为left,right,up,down分别表示当前箱子的左右上下边界(闭区间),然后进行遍历依次存入名为res的List中,最后返回List。

复杂度分析:

  • 时间复杂度O(nlogn) n代表的是自定义方法中使用了诸如[::-1]等切片访问操作,时间复杂度为O(n),外面的logn是因为整个外层循环的次数是对数级别的
  • 空间复杂度O(1) 额外6个变量 常数级别

运行结果:

在这里插入图片描述

你可能感兴趣的:(霍乱时期的Python之路,leetcode,算法,python)