zl程序教程

您现在的位置是:首页 > 

当前栏目

leecode59( 螺旋矩阵 II)

矩阵 II 螺旋
2023-06-13 09:11:07 时间

每日一题——leecode59( 螺旋矩阵 II)

https://www.bilibili.com/video/BV1ku411y7Z2

题意

难度:中等 (看清楚不是简单,别再说老子水文啊~)

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

示例 1:

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

示例 2:

输入:n = 1
输出:[[1]]

思路

一道模拟题,难度中等,面试出现频率极高。

模拟题就是本身不涉及算法,就是单纯根据题目所描述的模拟整个过程从而得到最后的结果

这类题天然的考察你的码力,即对编程语言的掌握能力,一不小心就会各种 bug。

做这类模拟题的要点就是多在纸上画一下,别空想把自己想晕了,代码写干净些,方面后面 debug…

这道题是按“顺时针”顺序对矩阵进行填充,方向无非就是“上下左右”,顺时针的话,填充就是按照“上->右->下->左”,写具体点就是:

  • 上:从左到右填充。
  • 右:从上到下填充。
  • 下:从右到左填充。
  • 左:从下到上填充。

同时找好每次填充的边界,比如最开始的时候最左侧边界 left = 0,最右侧边界 right = n-1,最上侧边界 up = 0,最下侧边界 down = n-1。

构造这里我讲解一下:(因为我刚开始也没理解) 这里给大家一个建议,没看明白解析,就去分开跑一下,不就清晰了还有要不耻下问哦!

代码实现

**round()**方法返回浮点数x的四舍五入值。

class Solution:

    def generateMatrix(self, n: int) -> List[List[int]]:
        # 初始化要填充的正方形
        matrix = [[0] * n for _ in range(n)]

        left, right, up, down = 0, n - 1, 0, n - 1
        number = 1  # 要填充的数字

        while left < right and up < down:

            # 从左到右填充上边
            for x in range(left, right):
                matrix[up][x] = number
                number += 1

            # 从上到下填充右边
            for y in range(up, down):
                matrix[y][right] = number
                number += 1

            # 从右到左填充下边
            for x in range(right, left, -1):
                matrix[down][x] = number
                number += 1

            # 从下到上填充左边
            for y in range(down, up, -1):
                matrix[y][left] = number
                number += 1

            # 缩小要填充的范围
            left += 1
            right -= 1
            up += 1
            down -= 1

        # 如果阶数为奇数,额外填充一次中心
        if n % 2:
            matrix[round(n // 2)][round(n // 2)] = number
            #round()  方法返回浮点数x的四舍五入值。

        return matrix