刷题第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怎么算也很关键。上述代码的注释写的非常详细,复习时应精读来理解整个过程。

相关推荐
luj_17682 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
郝学胜-神的一滴2 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆3 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng3 小时前
2024牛客暑期多校训练营1
算法
hetao17338373 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
技术小黑3 小时前
RNN算法实战系列06 | LSTM 实现糖尿病探索与预测
rnn·算法·lstm
疯狂打码的少年3 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
wabs6664 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance4 小时前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
..Dauntless..5 小时前
手写vector vs std::vector:从功能正确到性能达标
算法