• 螺旋矩阵_数组 | leecode刷题笔记


    刷题跟随carl代码随想录


    59. 中等螺旋矩阵II

    题目:给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
    .
    示例:输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
    在这里插入图片描述

    思路:坚持循环不变量原则,自始至终坚持左闭右开区间可以用range()来实现,range是前开后闭的,进行循环。【图片来自carl哥的代码随想录】
    carl代码随想录图片
    注意:含有个元素的方形二维数组,其长宽均为n!这个要搞清楚。
    代码的第一步是:初始化一个n行n列的二维数组,初始化为全零数组。

    当n = 4时:
    在这里插入图片描述
    当n = 5时:
    在这里插入图片描述

    四个方向每步各次n-1步,当n为奇数时,二维矩阵有中心点。
    数组的下标是从0开始的,所以:
    n=3时,中心点的索引为[1,1];
    n=5时,中心点的索引为[2,2];
    n为奇数时,索引坐标为[n//2, n//2]

    从左至右,从上至下,从右至左,总下至上为一次循环,
    n=3时,循环1次+1个中心点
    n=4时,循环2次
    n=5时,循环2次+1个中心点
    n=6时,循环3次
    循环次数=n//2 + 1个中心点(n为奇数时)
    在这里插入图片描述

    class Solution:
        def generateMatrix(self, n: int) -> List[List[int]]:
            nums = [[0] * n for _ in range(n)]  # 初始化为n行n列的二维数组
            startx, starty = 0, 0  #起始点为0行0列处
            loop, mid = n//2, n//2  # 迭代次数、n为奇数时,矩阵的中心点
            count = 1  # 计数
    
            for offset in range(1, loop + 1):
                for i in range(starty, n-offset):  # 从左往右, startx保持不变, starty递增
                    nums[startx][i] = count
                    count += 1
                for i in range(startx, n-offset):  # 从上至下, starty保持不变,startx递增
                    nums[i][n-offset] = count
                    count += 1
                for i in range(n-offset, starty, -1):  # 从右至左, startx保持不变,starty递减
                    nums[n-offset][i] = count
                    count += 1
                for i in range(n-offset, startx, -1):  # 从下至上, starty保持不变,,startx递减
                    nums[i][starty] = count
                    count += 1
                # 更新起点
                startx += 1
                starty += 1
            if n%2 == 1:  # n为奇数时,填充中心点
                nums[mid][mid] = count
            return nums
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    54. 中等螺旋矩阵

    题目:给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
    例1:

    在这里插入图片描述
    输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
    输出:[1,2,3,6,9,8,7,4,5]

    例2:

    在这里插入图片描述
    输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
    输出:[1,2,3,4,8,12,11,10,9,5,6,7]

    题解:摘自《carlsun-2代码随想录_leecode》
    与59.螺旋矩阵II不同的是:前题中的螺旋矩阵是正方形,只有正方形的边长n一个边界条件,而本题中,需要考虑长方形的长和宽(m行和n列)两个边界条件。自然,m可以等于n,即前题可视为本题在m==n的特殊情况。
    .
    我们从最一般的情况开始考虑,与59.螺旋矩阵II题解对比起来,m和n的带入,主要引来两方面的差异

    1. loop的计算
      本题的loop计算与59.螺旋矩阵II算法略微差异,因为存在rows和columns两个维度,可自行分析,loop只能取min(rows, columns),例如rows = 5, columns = 7,那loop = 5 / 7 = 2
    2. mid的计算及填充
      如果min(rows, columns)为偶数,则不需要在最后单独考虑矩阵最中间位置的赋值
      如果min(rows, columns)为奇数,则矩阵最中间位置不只是[mid][mid],而是会留下来一个特殊的中间行或者中间列,具体是中间行还是中间列,要看rows和columns的大小,如果rows > columns,则是中间列,相反,则是中间行

    😢太难了,先放一放

    
    
    
    • 1
    • 2

    待更……

  • 相关阅读:
    pc端如何实现点击按钮复制文本,一行代码解决
    环境变量基础
    java Map集合的使用
    Audition 2024 for Mac/Win:音频录制与编辑的卓越之选
    《数字图像处理-OpenCV/Python》连载(26)绘制椭圆和椭圆弧
    Halcon 阈值算子汇总
    《C++ Core Guidelines解析》:深入理解C++的最佳实践
    Redis 分片集群
    工具方法合集-utils.js
    实验 1--SQL Server2008数据库开发环境
  • 原文地址:https://blog.csdn.net/qq_44250700/article/details/126143912