【Leetcode】59. 螺旋矩阵 II(Spiral Matrix II)

No59. 螺旋矩阵 II

题目

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例

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

解题代码(Python3)

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        #返回以i开始,nums个数据
        def getData(i,nums):
            return [x for x in range(i,i+nums)]
        def setCol(i,col,up,down):
            data = getData(i,down - up - 1)
            if col == up:
                data = data[::-1]
            for index,x in enumerate(data):
                matrix[up+1+index][col] = x
        #设置每圈的顺时针数据
        def setRound(i,left,right):
            #n为奇数时 只有一个元素
            if left == right:
                matrix[left][right] = i
                return i + 1
            else:
                dis1 = right - left + 1
                dis2 = right - left - 1
                #分别设置上右下左4块
                matrix[left][left:right+1] = getData(i,dis1)
                setCol(i+dis1,right,left,right)
                matrix[right][left:right+1] = getData(i+dis1+dis2,dis1)[::-1]
                setCol(i+2*dis1+dis2,left,left,right)
            return i + 2*dis1 + 2*dis2
        matrix = [[-1]*n for i in range(n)]
        left  = 0
        right = n - 1
        i = 1
        while i <= n**2:
            i = setRound(i,left,right)
            left += 1
            right -= 1
        return matrix

思路:

与上一题类似,只不过由“访问”变为“改变”,涉及到二维List的赋值,所以相对要繁琐一点。依然以每一圈为一轮,分别对上右下左4块进行赋值,同时维护当前值i的大小。

注意,当n为偶数时,无特殊情况;当n为奇数时,最后中间会有一个单独的值进行赋值。

复杂度分析:

  • 时间复杂度 O(nlogn) 最外层循环是对数级别,自定义函数中涉及到[::-1]所以是n包裹logn
  • 空间复杂度 O(n)

注意这时的n实际上为n^2

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Xiao_Spring/article/details/113731600