【实战】ACM 选手图解 LeetCode 螺旋矩阵Ⅱ

DMA学习笔记 DMA(direct memory access,直接内存访问),是一种避开CPU,可以直接对外设和内存进行访问的技术,可以实现外设与内存、内存之间、外设之间的数据的访问和搬移。 阅读详情

大家好呀,我是你们的螺旋蛋。

今天解决螺旋矩阵Ⅱ,模拟法解决数组的练手好题,面试常见。

这道题没有算法上的难度,考察的是小婊贝们的代码能力和细心水平。

话不多说,正式开干。

5486ff5bdbafd6547fa02f75f5d2a8b

LeetCode 59:螺旋矩阵Ⅱ

题意

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

示例

输入:n = 3

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

解释:

5c0b88699ffc4a0f0c8ba9031e1ebf8

提示

  • 1 <= n <= 20

题目解析

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

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

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

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

a53b285f8372669f03325e7c8202107

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

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

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

此处你应该拿出笔和纸,开始在纸上写写画画了。

理解了上面话,我们来看图解。

图解

以 n = 4 为例。

首先初始化结果矩阵和上下左右边界。

0780a2766b25720da23716c42927e53

# 初始化结果矩阵
res = [[0] * n for i in range(n)]
# 维护当前值
cnt = 1
# 初始化左、右、上、下边界。
left, right, up, down = 0, n-1, 0, n-1

接下来按照顺时针顺序填充结果矩阵。

第 1 步最上行从左到右填充:

此时 up = 0,固定不变,从左至右在 [left, right] 间填充。

6c16989609fb54279448a9cf8e43540

# 从左到右
for i in range(left, right + 1):
    res[up][i] = cnt
    cnt += 1

此时最上行被填充完毕,上边界 top 发生了改变,需要向下移动。

37e4c4cfeaafba0b02f1f30e9e398cf

up += 1

第 2 步最右列从上向下填充:

此时 right = n - 1 =3,固定不变,从上至下在 [up, down] 之间填充。

5f46c90dc11ca9e8561c16d0a24f674

# 从上到下
for i in range(up, down + 1):
    res[i][right] = cnt
    cnt += 1

此时最右列被填充完毕,右边界 right 发生了改变,需要向左移动。

1c2a2be2bb6edd1b54472c87a74c8ae

right -= 1

第 3 步最下行从右向左填充:

此时 down = n - 1 = 3 固定不变,从右至左在 [left, right] 之间填充。

e62d458df8c4f654adb023129373b0f

# 从右到左
for i in range(right, left-1, -1):
    res [down][i] = cnt
    cnt += 1

此时最下行被填充完毕,下边界 down 发生了改变,需要向上移动。

9fc4216a24a95a54d895c0b362cedd6

down -= 1

第 4 步最左列从下向上填充:

此时 left = 0 固定不变,从下至上在 [up, down] 之间填充。

db9278acf2030a0496fee8cb6a5d683

# 从下到上
for i in range(down, up-1, -1):
    res[i][left] = cnt
    cnt += 1

此时最左列被填充完毕,左边界 left 发生了改变,需要向右移动。

d14ff8a236ffcb7f6640f9eba0beabf

left += 1

剩下的步骤就是重复上面 4 步,直到 n² 的数都填完。

本题模拟法矩阵大小为 n²,需要全部遍历且填充,所以时间复杂度为 O(n²)。

此外额外维护了一个大小为 n² 的结果矩阵,所以空间复杂度为 O(n²)。

代码实现

Python 代码实现

class Solution(object):
    def generateMatrix(self, n):
        """
        :type n: int
        :rtype: List[List[int]]
        """
        # 初始化结果矩阵
        res = [[0] * n for i in range(n)]
        # 维护当前值
        cnt = 1
        # 初始化左、右、上、下边界。
        left, right, up, down = 0, n-1, 0, n-1

        while cnt <= n * n:
            # 从左到右
            for i in range(left, right + 1):
                res[up][i] = cnt
                cnt += 1
            up += 1
            # 从上到下
            for i in range(up, down + 1):
                res[i][right] = cnt
                cnt += 1
            right -= 1
            # 从右到左
            for i in range(right, left-1, -1):
                res [down][i] = cnt
                cnt += 1
            down -= 1
            # 从下到上
            for i in range(down, up-1, -1):
                res[i][left] = cnt
                cnt += 1
            left += 1

        return res

Java 代码实现

class Solution {
    public int[][] generateMatrix(int n) {
        int left = 0, right = n - 1, up = 0, down = n - 1;
        int[][] res = new int[n][n];
        int cnt = 1;
        while(cnt <= n * n){
            for(int i = left; i <= right; i++) res[up][i] = cnt++;
            up++;
            for(int i = up; i <= down; i++) res[i][right] = cnt++;
            right--;
            for(int i = right; i >= left; i--) res[down][i] = cnt++; 
            down--;
            for(int i = down; i >= up; i--) res[i][left] = cnt++; 
            left++;
        }
        return res;
    }
}

图解螺旋矩阵Ⅱ到这就结束辣,是不是模拟法搞的焦头烂额了?

没事,刚接触这样的题都是写一堆 bug,做多了,码力上升了就 ok 了。

多点耐心,多写写画画,一步一步的来。

差不多数组的实战题到这就结束了,基本上每道题都是一种新的解题方法,大家一定要仔细揣摩,多加练习。

还有不要忘了我的点赞呀。

我是帅蛋,我们下次见!

springboot + netty 实现多客户端登录 超出设备 并下线 本文档旨在详细描述多平台登录控制的需求和实现方案。当前系统仅支持单设备登录,需扩展为支持多设备同时在线,并提供多种登录策略。文档详细列出四种策略:单平台登录、双平台登录、三平台登录和多平台同时在线,每种策略的具体限制和支持平台。技术实现方案包括数据结构设计、NettyUtils 工具类方法、WebSocketHandler 修改,以及相应的测试方案 阅读详情

相关推荐

0欧电阻、电感、磁珠单点接地时有什么区别?

0欧电阻、电感、磁珠单点接地时有什么区别? #电阻,#电感,#磁珠 一、0欧姆电阻 重点介绍:模拟地和数字地单点接地。 只要是地,最终都要接到一起,然后入大地。如果不接在一起就是“浮地”,存在压差,容易积累电荷,造成静电。地是参考0电位,所有电压都是参考地得出的,地的标准要一致,故各种地应短接在一起。 人们认为大地能够吸收所有电荷,始终维持稳定,是最终的地参考点。虽然有些板子没有接大地,但发电厂是接大地的,板子上的电源最终还是会返回发电厂入地。如果把模拟地和数字地大面积直...

FAguangdeer的博客 449

904. 水果成篮,59. 螺旋矩阵 II

此题为滑动窗口系列中的计数问题,freq数组记录现在窗口中两种水果的数目,count记录现在窗口中有多少种不同的水果,如果count<=2,那么rightIndex指针可以一直向右移动,直到count>2,当count>2时,说明窗口中的水果种类超过2,为了减少水果种类,leftIndex指针就要向右移动,移动的同时还要更新freq数组,最后取最大值即可。 def totalFruit(fruits): res = 0 leftIndex = 0 rightInde

qq_44925830的博客 245

Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法

[原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结 by edata @2017-5-1 objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法 因为Win8/Win10对系统盘(默认c:)使用了高级权限管理,所以在此盘下操作文件的修改工作都需要管理员权限才行。 基于这个原因,导致非管理员安

edata的博客 7029

解题思路-leetcode第五十九题:螺旋矩阵Ⅱ

解题思路-leetcode第五十九题:螺旋矩阵Ⅱ 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 解题思路:本题采用循环赋值的方法,其关键之处如何对提前建立的列表进行螺旋遍历并赋值,本题通过设置两个标志位实现遍历的过程中转向,程序设置a,b,x,y四个变量,其中a,b代表横纵坐标,x,y代表转向标志。当x为0时,则遍历的过程中横坐标不变,当y为0

PPlemoin123的博客 711

IDEA中Maven工具栏与命令执行全攻略:高效开发必备技巧

IntelliJ IDEA 作为强大的 Java 开发工具,其 Maven 功能独具优势。Maven 工具栏位于工作区右侧,图标功能丰富,涵盖项目导入、源码处理、依赖操作等。执行 Maven 命令有多种途径,Run Anything 窗口可输入或选目标执行,上下文菜单能右键运行目标,还可创建运行配置,指定命令参数后运行,为开发者高效管理 Maven 项目、便捷执行命令提供有力支持。

2301_82300081的博客 2032

XGBoost实战:从原理到调参,手把手教你提升模型性能(附Python代码)

本文深入解析XGBoost核心原理,并提供一套从数据准备、系统性调参到生产部署的完整实战指南。通过剖析目标函数、正则化项与分裂算法,帮助读者理解参数背后的数学逻辑,并利用交叉验证、早停法及自动化工具(如Optuna)高效提升模型性能。文中附有详尽的Python代码示例,涵盖类别特征处理、缺失值应对、不平衡数据调整及模型可视化等高级技巧。

weixin_29178069的博客 460

leetcode-59-螺旋矩阵 II

一、题目 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例1 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 二、代码 python def generateMatrix(n): ans=[[0]*n for i in range(n)] i,j,di,dj=0...

小黄鸡成长之路 302

[深度学习] 从 originbot 到 origincar

原来,OriginBot的摄像头是MIPI模式,而OriginCar的摄像头是USB摄像头,也就是imageWidth 是0~959,超过了范围640。origincar在执行以下命令部署模型时。

chdlr的博客 2386

Leetcode54:螺旋矩阵

文章目录题目描述代码实现视频讲解 题目描述 代码实现 public List<Integer> spiralOrder(int[][]matrix){ List<Integer>res=new ArrayList<Integer>(); if (matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0) { return res; } int rowBegin=

sparky的博客 293

基于51单片机的智能花盆灌溉系统设计与实现

本文详细介绍了基于51单片机的智能花盆灌溉系统设计与实现,通过DS18B20温度传感器、土壤湿度传感器和LCD1602显示屏等硬件模块,结合精确的算法控制,实现自动监测与灌溉。系统解决了传统灌溉依赖定时器、缺乏可视化界面的问题,适合上班族、园艺爱好者和植物园工作人员使用,有效提升植物养护效率。

honey的博客 1016

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

WW、forever的博客 555

leetcode59数组 螺旋矩阵

【代码】leetcode59数组 螺旋矩阵。

dokii1的博客 151

【实战】LLaMA-Factory 如何做 LLM 的多轮对话微调

LLaMA-Factory 作为一个广受欢迎、易于使用的 LLM 微调框架,为开发者提供了便捷的途径来针对特定任务(包括多轮对话)优化模型。本文将深入探讨 LLaMA-Factory 如何支持多轮对话微调,涵盖其基本概念、数据准备、核心机制、评估方法等。简单来说,多轮对话是指包含两个或更多轮次(Turn)的交互过程,其中每一轮通常包含用户的一个输入和模型的一个输出。后续轮次的回应通常依赖于前面轮次的对话内容。模型需要理解并记忆对话历史。

kakaZhui的博客 1311

动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100

将一个复杂问题拆分成多个规模更小的子问题,通过保存子问题的计算结果,避免重复计算,最终得到原问题的答案。先看一个经典问题。dp[i] = 以第 i 个元素结尾的最优结果例如最长递增子序列。最长递增子序列不一定以最后一个元素结尾,因此必须遍历整个数组取最大值。dp[i] = 前 i 个元素的最优结果这种情况下,最终答案通常就是dp[n]。关键在于理解 dp 数组的定义。动态规划的核心并不是背诵某个固定模板,而是建立正确的状态定义,并通过状态转移方程解决问题。dp[i] 或 dp[i][j] 表示什么?

zengjiajun2006的博客 882

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 186

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 213

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

力扣73 矩阵置零

该解法通过标记含0的行和列来实现矩阵置零。遍历矩阵,用布尔数组记录有0的行和列;再遍历一次,若当前行或列被标记,则置为0。时间复杂度O(mn),空间复杂度O(m+n)。

Pniubi的博客 33

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 226

LeetCode 3105.最长的严格递增或递减子数组:一次遍历

LeetCode 3105.最长的严格递增或递减子数组:一次遍历

<font color="Pink">Tisfy的博客</font> 182

LeetCode Hot 100 二叉树专题(三):BST 二叉搜索树与右视图(Java)

本专题主线:三题(98 / 230 / 199)共用两把钥匙——BST 的中序序列严格递增,以及遍历中的"层"与"深度"标记。看懂这两点,三题共用一套模板。 结构约定:每题统一分三部分——①题目分析与解题思路(含易错点辨析);②常见解法(附代码)及讲解;③知识点总结。

2401_88612756的博客 714

【双指针|LeetCode1089 复写零】巧用逆向思路,破解原地覆盖陷阱

LeetCode1089.复写零要求原地复写数组中的0,避免覆盖未读元素。正向遍历会因写入操作破坏后续数据,故不可行。正确解法为逆向双指针:先正向预处理确定目标末尾位置,再从后向前复写,遇0写两个0,非0则直接搬运。需特别处理0复写越界情况(仅保留一个0)。时间复杂度O(n),空间复杂度O(1),是原地数组操作的经典范例。

2602_95684935的博客 225

力扣240搜索二维矩阵(二分查找)

本文介绍在力扣240题“搜索二维矩阵II”中,对每一行独立使用二分查找的解法。通过遍历每行并调用二分查找函数判断目标值是否存在,若找到则返回true,否则最终返回false。该方法利用了每行有序的特性,时间复杂度为O(m log n),其中m为行数,n为列数。具体二分查找逻辑可参考作者主页中关于力扣35题“搜索插入位置”的实现。

Pniubi的博客 86

LeetCode100 94. 二叉树的中序遍历

中序遍历(左根右)通过栈实现,模拟递归过程。从根开始,不断向左走并压栈,直到左子树为空;弹出栈顶节点访问(根),转向其右子树重复流程。样例:1→2→3,遍历顺序为1→3→2。时间复杂度O(n),空间复杂度O(h)。

Shaoxingzong的博客 163

力扣35搜索插入位置(二分查找)

该题通过二分查找寻找插入位置。使用 mid = (left + right) >> 1 防止整数溢出,等价于 (left + right) / 2,但更安全。当 target <= nums[mid] 时,更新答案并继续向左查找;否则向右。最终返回最小的插入位置,时间复杂度 O(log n),空间复杂度 O(1)。

Pniubi的博客 195

力扣hot100-滑动窗口最大值

先提交了一版结果用二重循环超时了。我还奇怪不是【困难】吗?这里面因为要判断堆顶元素下标,所以用了pair,来同时存放元素和下标。然后我又学习了官方题解,大根堆的方法。学到了一个新的容器:大根堆。heap.top();// 查看最大的数,不删除。heap.pop();

m0_61483444的博客 230

LeetCode100+拓扑排序+多源BFS+矩阵置零

摘要(≤150字): 三题均考察算法优化与经典思想。矩阵置零通过利用首行首列作标记,实现O(1)空间原地操作;腐烂橘子问题用BFS模拟感染过程,结合新鲜橘子计数判断是否可全部腐烂;课程表问题通过拓扑排序检测有向图是否存在环,基于入度数组与邻接表判断课程依赖是否可行。三者分别体现标记法、广搜传播与图论拓扑的核心应用。

记录大学学习学习成长过程,欢迎各位一起交流 561
上一篇: 【实战】ACM 选手图解 LeetCode 长度最小的子数组
下一篇: 【图解】ACM 选手带你玩转链表
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值