Leetcode 54. 螺旋矩阵

【中等】力扣算法题解析LeetCode54:螺旋矩阵 本文介绍了一种模拟顺时针螺旋遍历矩阵的算法。通过维护四个动态边界(上、下、左、右),依次处理矩阵的外层元素后向内收缩边界,直至覆盖所有元素。算法时间复杂度为O(m×n),空间复杂度O(1)(不含结果存储)。Java实现中预分配结果列表容量,并通过循环条件确保无重复访问。该解法高效直观,适用于任意m×n矩阵的螺旋遍历需求。 阅读详情

题目

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

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

示例 2:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

解答

解法一:轮圈遍历

每次遍历都转一圈,每一行或列遍历完后就更新边界值并判断是否结束。

遍历顺序:左到右,上到下,右到左,下到上。

代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix == null || matrix.length == 0) return new ArrayList<>();
        
        List<Integer> res = new ArrayList<>();
        int m = matrix.length;
        int n = matrix[0].length;
        
        int u = 0, d = m - 1, l = 0, r = n - 1;
        for(;;) {
            for(int i = l; i <= r; i ++) res.add(matrix[u][i]);
            if(++ u > d) break;
            
            for(int i = u; i <= d; i ++) res.add(matrix[i][r]);
            if(-- r < l) break;
            
            for(int i = r; i >= l; i --) res.add(matrix[d][i]);
            if(-- d < u) break;
            
            for(int i = d; i >= u; i --) res.add(matrix[i][l]);
            if(++ l > r) break;
        }
        
        return res;
    }
}
结果

在这里插入图片描述

解法二:回溯法

写完解法一之后,我自己想了想,发现也可以使用回溯法解决呀。
按照 右 -> 下 -> 左 ->上 的方向去递归不就好了吗。
但是需要注意的就是最左边的一列也就是 下 -> 上 的方向需要改变遍历顺序。
是个新思路,有兴趣的可以看看,两个解法效率差不多。

代码
class Solution {
    // (上) 右 下 左 上
    int[][] d = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    boolean[][] used;
    
    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix == null || matrix.length == 0) return new ArrayList<>();
        int row = matrix.length;
        int col = matrix[0].length;
        used = new boolean[row][col];
        List<Integer> res = new ArrayList<>();
        find(matrix, 0, 0, res);
        return res;
    }
    
    private void find(int[][] matrix, int x, int y, List<Integer> res) {
        used[x][y] = true;
        res.add(matrix[x][y]);
        
        int startIdx = 1;
        // 向左 和 向下 都不能使用的话,说明是最左边的那一列,优先搜索 上 即可
        if(!canUse(matrix, x, y - 1) && !canUse(matrix, x + 1, y)) startIdx = 0;
        for(int i = startIdx; i < d.length; i ++) {
            int newX = x + d[i][0];
            int newY = y + d[i][1];
            if(canUse(matrix, newX, newY)) {
                find(matrix, newX, newY, res);
            }
        }
    }
    
    private boolean canUse(int[][] matrix, int x, int y) {
        return x >= 0 && x < matrix.length && y >= 0 && y < matrix[0].length && !used[x][y];
    }

}
结果

在这里插入图片描述

从Demo到产品:基于ADAU1452的ANC方案,硬件选型、性能优化与避坑指南 本文详细解析了基于ADAU1452的主动降噪(ANC)方案从Demo到产品的实现路径,涵盖硬件选型、性能优化与实战避坑指南。重点探讨了ADAU1452与ADAU1466的性能差异、编解码器选型策略,以及MFXLMS算法优化技巧,为工程师提供从理论验证到量产落地的系统级解决方案。 阅读详情

相关推荐

Multisim实战:5分钟搞定一阶RC电路仿真(附示波器波形分析技巧)

本文通过Multisim软件,详细演示了如何快速搭建一阶RC电路并进行仿真分析。文章提供了从元件选取、电路连接、虚拟示波器设置到波形观测的完整流程,并重点分享了测量时间常数、区分电路响应类型等核心分析技巧,帮助电子工程初学者和爱好者高效掌握电路仿真与分析方法。

weixin_29175469的博客 182

leetcode 螺旋矩阵 java

给定一个包含m x n个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] ...

keliwahada 666

基于osgEarth的二维态势中时变对象的绘制方法

在态势系统中,卫星、飞机的轨迹、覆盖等的几何数据随时间改变,称之为时变对象。在以OSGEarth实现的二维态势中,如果利用OSGEarth的预定义线、面类型处理这种几何数据的动态改变,则导致效率极具降低。介绍了此问题并给出解决技巧。

eyepeak的博客 2090

leetcode练习(螺旋矩阵)(java实现)

螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,...

AXKDD6555的博客 555

【中兴交换机MC-LAG配置】

​ 中兴mc-lag配置 主设备配置如下: Keepalive链路 interface smartgroup1023 //用作MC-LAG的Keepalive链路接口 switch attribute disable yes description For_Keepalived exit interface xgei-0/1/1/47 switch attribute disable yes description For_Keepalived exit interface

qq_31440733的博客 1万+

手把手教你排查Abaqus中的Johnson-Cook损伤参数:避免因d3正负号导致的仿真失败

本文详细解析了Abaqus中Johnson-Cook损伤参数d3正负号设置的关键问题,帮助用户避免因参数错误导致的仿真失败和Excessive distortion报错。通过对比不同文献定义、提供实操指南和典型错误排查流程,有效提升非线性分析的准确性和效率。

weixin_33960567的博客 353

LeetCode54.螺旋矩阵(Java实现)

链接:https://leetcode-cn.com/problems/spiral-matrix/ class Solution { public List<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> list=new ArrayList<Integer>();...

Teacher_HENG 1825

【施磊】C++课程笔记目录

【C++编程】施磊老师C++笔记目录

GeniusAng的博客 4122

Leetcode 59. 螺旋矩阵 II

题目 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 解答 解法一:轮圈赋值 解法与 螺旋矩阵 没有太大区别,只是反过来了而已。 螺旋矩阵解法:https://blog.csdn.net/LetJava/article/detail...

LetJava的博客 328

37、深入解析SCTP与RTP传输协议

本文深入解析了SCTP与RTP两种重要传输协议。SCTP提供可靠的多流数据传输,支持关联管理、选择性确认和错误处理,适用于高可靠性场景;RTP则专注于实时音视频数据的低延迟传输,配合RTCP实现质量监控。文章详细介绍了两种协议的数据结构、工作流程及应用场景,并对比其特性,帮助开发者根据可靠性、实时性和多流需求选择合适的协议。

time3的博客 83

uniapp - [全端兼容] 详解实现国际化多语言切换全流程及示例,全部页面中英文多语言随意切换即时生效,语言切换全项目立即变化可自定义新增各国其他语言,uniApp实现中英文语言切换完整源码教程!

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniapp多语言实现,uni-app项目使用多语言切换功能,中英文切换,uniapp实现中英文语言切换,uniApp实现国际化多语言切换,中文英文之间的更换,Uniapp使用什么插件能支持多种语言,退出后重启依然能让语言保留,设置可切换中英文,uniapp国际化页面双语/顶部导航双语/根据系统语言双语,标题栏文字原生底部菜单tabbar怎么改,使用vue-i18n国际化多国语言,全平台i18n插件,

🏆 前端领域优质创作者 1万+

LeetCode—spiral-matrix(螺旋矩阵)—java

题目描述:Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.For example,Given the following matrix:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You sho...

Lynn_Baby的博客 938

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LeetCode 54. 螺旋矩阵 C++描述

LeetCode 54. 螺旋矩阵 C++描述 难度:中等 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [...

一起加油 6270

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【leetcode54】螺旋矩阵

题目描述 力扣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] 代码: package main func spira

欢迎来到胡桃木的博客 243

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LeetCode 力扣 54. 螺旋矩阵

题目描述(中等难度) 从第一个位置开始,螺旋状遍历二维矩阵。 解法一 可以理解成贪吃蛇,从第一个位置开始沿着边界走,遇到边界就转换方向接着走,直到走完所有位置。 /* * direction 0 代表向右, 1 代表向下, 2 代表向左, 3 代表向上 */ public List<Integer> spiralOrder(int[][] matrix) { List&l...

wind_liang的博客 1105

LeetCode 54螺旋矩阵

LeetCode 54螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m行, n列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 输入: [ up left [1,2,3], [4,5,6], [7,8,9], right down ] 输出:[1,2,3,6,9,8,7,4,5] 思路:四指针扫描O(n2) 从左到右访问第一行,left++ 从上到下访问最后一列,up-- 从右往左访问最后一

XBlog 314

力扣第 54 题: 螺旋矩阵

要求从矩阵的左上角开始,按顺时针方向逐层遍历矩阵中的所有元素,并以一维数组的形式返回结果。解决,通过维护矩阵的边界(上下左右四个方向)来实现螺旋顺序的输出。力扣第 54 题 ——测试用例中定义了一个。

weixin_48941116的博客 1105

54. 螺旋矩阵 - 力扣(LeetCode)

首先定义四个边界变量。输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]遍历 matrix[1][2] 到 matrix[2][2],添加到 res 中。遍历 matrix[2][1] 到 matrix[2][0],添加到 res 中。遍历 matrix[1][0] 到 matrix[1][0],添加到 res 中。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]

q1111111da的博客 897

LeetCode 54 螺旋矩阵(java实现)

LeetCode 54 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9...

大白菜的博客 488

Leetcode54(力扣54):螺旋矩阵

题目:给定一个矩阵,按照顺时针的方向打印,如 {[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]} 输出应该是1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 思路:一圈一圈的打印,

weixin_44537258的博客 219

力扣:54.螺旋矩阵

力扣:螺旋矩阵 题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if (matrix.size() == 0 || matrix[0].size() == 0) { return {};

qq_56762247的博客 550

LeetCode 54 螺旋矩阵

// LeetCode 54 螺旋矩阵 // 分情况讨论,注意终止条件,奇偶统一,用上取整 class Solution { public List<Integer> spiralOrder(int[][] matrix) { if (matrix.length == 0) return new ArrayList<>(); Li...

TIMELIMITE的专栏 368

LeetCode54-螺旋矩阵

LeetCode54-螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10...

lyd1995的博客 192

力扣54、螺旋矩阵的一点想法(Python)

回到我们的题目中,我们需要将剔除的第一行进行输出,然后进行对整体顺时针翻转,然后重复这样的操作即可。

SinkAboutIt的博客 993

day13【LeetCode力扣】54.螺旋矩阵

数组相关题目我们暂时先练习到这里,下一章我们开始链表相关题目的学习~​​​。

canGfly的博客 607

【LeetCode54螺旋矩阵、LeetCode59螺旋矩阵II:简单模拟(Java实现,一种思想解决两道题)】

通过模拟解决螺旋矩阵生成及遍历问题

NorthSmile的博客 868
上一篇: Leetcode 53. 最大子序和
下一篇: Leetcode 56. 合并区间
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值