刷题第2天(中等题):LeetCode59--螺旋矩阵--考察模拟能力(边界条件处理)

LeetCode59:

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

示例 1:

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

示例 2:

复制代码
输入:n = 1
输出:[[1]]

提示:`1 <= n <= 20`

思路分析: 这道题目不考具体的算法,纯模拟过程,考察对边界条件的处理和对代码的掌控能力。

模拟顺时针画矩阵的过程:

1.填充上行从左到右

2.填充右列从上到下

3.填充下行从右到左

4.填充左列从下到上

由外向内这样一圈一圈画下去,画每一条边都必须坚持左闭右开原则。

代码:

python 复制代码
class Solution:
    def generateMatrix(self, n: int)-> List[List[int]]:
        nums = [[0] * n for _ in range(n)]  # 创建一个长度为n,值均为0的列表
        startx, starty = 0, 0  # 起始点为[0,0]
        loop, mid = n // 2, n // 2  # 整除2,设置循环的层数(往里缩一圈需要减少2个位置)、n为奇数时; 矩阵的中心点
        count = 1  # 计数

        for offset in range(1, loop + 1):  # 每循环一层偏移量加1, 偏移量从1开始

            for i  in range(starty, n - offset):  # 设置上行,从左至右,左闭右开
                nums[startx][i] = count  # 行标不变,列标递增
                count += 1  # 计数递增

            for i in range(startx, n - offset):  # 设置右列,从上至下,左闭右开
                nums[i][n - offset] = count  # 列标不变,行标递增
                count += 1 # 计数递增

            for i in range(n - offset, starty, -1):  # 设置下行,从右至左,左闭右开
                nums[n - offset][i] = count  # 行标不变(下行行标为n-offset,动态变化),列标递增
                count += 1 # 计数递增
            
            for i in range(n - offset, startx, -1):  # 设置左列,从下至上,左闭右开
                nums[i][starty] = count  # 列坐标是starty, 而不是n-offset哦!
                count += 1 # 计数器递增
            
            startx += 1
            starty += 1  # 注意循环完一圈后,startx, starty都要加1哦
        
        if n % 2 != 0:  # 当n为奇数时,填充中心点
            nums[mid][mid] = count  # 因为上面每次赋值完,count都会后加1,所以直接赋值就好了
        return nums  # 返回排列好的矩阵
                


        

总结:处理边界需要严格按照左闭右开的原则,另外理解loop怎么算也很关键。上述代码的注释写的非常详细,复习时应精读来理解整个过程。

相关推荐
xiaoshiguang34 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡4 小时前
【C语言】判断回文
c语言·学习·算法
别NULL4 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇4 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
yuanbenshidiaos5 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习5 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA5 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo5 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc6 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
云云3216 小时前
怎么通过亚矩阵云手机实现营销?
大数据·服务器·安全·智能手机·矩阵