leetcode热题HOT 54. 螺旋矩阵(59. 螺旋矩阵 II)

news2024/11/23 10:03:08

一、问题描述:

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

二、解题思路:

  1. 整体思路就是模拟螺旋遍历矩阵的过程,依次遍历外围边界的元素,并将其按顺序存入结果列表中。这样就可以实现将二维矩阵按螺旋顺序转换为一维数组的效果。
  2. 解题思路:
    ①定义变量 l 来表示当前层,以及变量 n 和 m 分别表示矩阵的行数和列数。定义 mid = Math.min(n, m) / 2,作为遍历层数的上限。
    ②接下来,通过一个 while 循环,不断遍历矩阵的外围边界,按照螺旋的顺序将元素加入结果列表中。具体的遍历顺序为:从左到右、从上到下、从右到左、从下到上,分别对应四个边界。
    ③在遍历过程中会不断更新当前层 l 的值,并且在遍历完成后,如果矩阵的行或列是奇数,还会补齐中心点周围的元素。
    螺旋过程

三、代码示例:

//时间复杂度为O(n*m)
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>(); // 创建一个用于存放结果的列表
        int l = 0; // 定义一个变量 l 来表示当前层
        int n = matrix.length; // 获取矩阵的行数
        int m = matrix[0].length; // 获取矩阵的列数
        int mid = Math.min(n, m) / 2; // 计算行数和列数的较小值除以2,作为遍历层数的上限

        while (l < mid) { // 当 l 小于 (行数和列数中的较小值/2) 时,继续循环
            for (int j = l; j < m - l - 1; j++)
                res.add(matrix[l][j]); // 添加元素到结果列表,第 l 行

            for (int j = l; j < n - l - 1; j++)
                res.add(matrix[j][m - l - 1]); // 添加元素到结果列表,最后 m-l-1 列

            for (int j = m - l - 1; j > l; j--)
                res.add(matrix[n - l - 1][j]); // 添加元素到结果列表,最后 n-l-1 行

            for (int j = n - l - 1; j > l; j--)
                res.add(matrix[j][l]); // 添加元素到结果列表,第 l 列

            l++; // 继续下一层
        }
        if (Math.min(n, m) % 2 != 0) { // 如果矩阵的行或列是奇数,需要补齐中心点周围的元素
            if (n > m) { // 如果行数大于列数
                for (int i = mid; i < mid + n - m + 1; i++)
                    res.add(matrix[i][mid]); // 补齐中心点上方的元素
            } else { // 如果列数大于行数
                for (int i = mid; i < mid + m - n + 1; i++)
                    res.add(matrix[mid][i]); // 补齐中心点左侧的元素
            }
        }
        return res; // 返回结果列表
    }
}

  • 时间复杂度分析:按照顺时针螺旋顺序遍历二维矩阵,并将遍历结果存储在一个列表中。矩阵中的每个元素都要被访问一次。因此时间复杂度为O(n*m)。

四、补充与总结:

建议先做一下59题,该题中矩阵的行和列是相等的。

  1. 螺旋矩阵 II
    给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
  • 解题思路:
    ①创建一个 n x n 的二维数组来表示矩阵,初始化为全0。
    ②定义变量 l 作为当前层的索引,初始值为 0。
    ③定义变量 a 用来填充矩阵,初始值为 1。
    ④在每一层循环中,按照顺时针的顺序填充矩阵的元素:
    (1)从左到右填充当前层的上方一行。
    (2)从上到下填充当前层的右侧一列。
    (3)从右到左填充当前层的下方一行。
    (3)从下到上填充当前层的左侧一列。
    (4)每填充一个位置,就将 a 的值加一。
    ⑤继续进行下一层的填充,直到遍历完所有层。

  • 代码示例

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n]; // 创建一个 n x n 的矩阵
        int l = 0; // 定义一个变量 l 来表示当前层
        int a = 1; // 初始值为 1,用来填充矩阵
        
        while (l < n / 2) { // 当 l 小于 n/2 时,继续循环
            // 填充当前层的上方一行
            for (int j = l; j < n - l - 1; j++)
                matrix[l][j] = a++;
            
            // 填充当前层的右侧一列
            for (int j = l; j < n - l - 1; j++) 
                matrix[j][n - l - 1] = a++;
            
            // 填充当前层的下方一行
            for (int j = n - l - 1; j > l; j--) 
                matrix[n - 1 - l][j] = a++;
            
            // 填充当前层的左侧一列
            for (int j = n - l - 1; j > l; j--) 
                matrix[j][l] = a++;
            
            l++; // 继续下一层
        }
        
        if (n % 2 == 1) // 如果 n 为奇数,填充中心点的元素
            matrix[l][l] = a;
        
        return matrix; // 返回填充好的矩阵
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1494003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vant van-field 密码输入框小程序里隐藏、显示密码bug总结

老规矩先上效果图: vant 输入框组件 密码的隐藏与显示功能&#xff1a; 注: 用password属性控制密码的显示与隐藏 不要用type属性&#xff0c;type属性在真机上有时会没有效果 1、当然如果只用typepassword 不需要切换显示、隐藏也可以使用。 2、如果用到了密码的显示与…

计算机mfc140.dll文件缺失的修复方法分析,一键修复mfc140.dll

电脑显示mfc140.dll文件缺失信息时&#xff0c;不必担心&#xff0c;这通常是个容易解决的小问题。接下来让我们详细探究并解决mfc140.dll文件缺失的状况。以下将详述相应的解决方案&#xff0c;从而帮助您轻松克服这一技术难题。通过几个简单步骤&#xff0c;即可恢复正常使用…

mac使用Vscode运行C语言遇到的问题

mac系统如何使用vscode运行C语言 Unable to start debugging. Program path ‘/Users/ling/Learning/frontEnd/web/Test/main.cpp’ is missing or invalid. LLDB failed with message: Command ‘file-exec-and-symbols’. Target binary ‘/Users/ling/Learning/frontEnd/we…

(2024,SD3,整流流,定制的采样器,DiT)扩展整流流 transformer 以实现高分辨率图像合成

Scaling Rectified Flow Transformers for High-Resolution Image Synthesis 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 流的无模拟训练 3. 流轨迹 3.1. RF 模型的定…

运维知识点-ACCESS

ACCESS access 扫出后缀为asp的数据库文件 迅雷下载&#xff0c;直接改后缀为.mdbMicrosoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点&#xff0c;是 Microsoft Office 的系统程序之一。 Microsoft Off…

商城|商城小程序|基于微信小程序的智慧商城系统设计与实现(源码+数据库+文档)

商城小程序目录 目录 基于微信小程序的智慧商城系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、 商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …

防患未然,OceanBase巡检工具应用实践——《OceanBase诊断系列》之五

1. OceanBase为什么要做巡检功能 尽管OceanBase拥有很好的MySQL兼容性&#xff0c;但在长期的生产环境中&#xff0c;部署不符合标准规范、硬件支持异常&#xff0c;或配置项错误等问题&#xff0c;这些短期不会出现的问题&#xff0c;仍会对数据库集群构成潜在的巨大风险。为…

几种电脑提示mfc140.dll丢失的解决方法,以及如何预防mfc140.dll丢失

mfc140.dll真是一个超级关键的动态链接库文件&#xff01;一旦这个文件不翼而飞&#xff0c;可能会导致一些程序无法顺利运行&#xff0c;甚至给系统带来麻烦。但别担心&#xff01;遇到mfc140.dll文件丢失的情况&#xff0c;我们有一堆应对措施可以立马施行&#xff0c;确保问…

qnx display

05-SA8155 QNX Display框架及代码分析(1)_openwfd-CSDN博客 backlight p: 0 t: 0 00000 SHD -----ONLINE----- 2024/03/06 13:49:22.046 backlight p:1060958 t: 1 00000 ERR backlight_be[backlight_be.c:284]: pthread_create enter 2024/03/06 13…

java多线程编程(四)-----线程池

一.线程池的介绍 java中的池是非常重要的思想方法&#xff0c;比如内存池&#xff0c;进程池&#xff0c;连接池&#xff0c;常量池等等。本篇重点介绍java中的线程池。这里的这些池的概念都是一样的&#xff0c;比如做饭的时候&#xff0c;有烧水&#xff0c;切菜&#xff0c…

持续集成(CICD)- Jenkins+Git+gogs综合实战(笔记二)

文章目录 七、拉取代码方法一:直接填写命令进行拉取(不建议用这种)方法二:使用源码管理拉取代码步骤一:确认环境(检查自己是否有Git插件)步骤二:构建项目时对项目的源码管理选择 Git步骤三:输入你仓库的SSH地址或者https地址,并且添加gitee的用户名和密方法一和方法二…

bug_java

文章目录 1.创建Maven时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本5 1.创建Maven时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本5 在 maven地址\conf\setting.xml 中设置默认jdk版本… 把图…

VGW在 Windows 平台上局域网就绪的旁路由器程序

在查阅本篇文章之前可以查看下&#xff0c;本人前两年写的关于VGW软件路由器的文章 Linux 平台上面单网卡 TUN/TAP实现局域网其它设备上网_linux 物理网卡与tun同网段-CSDN博客 VGW软件路由器是一个工作IEEE以太网&#xff08;L2&#xff09;链路层的路由器程序&#xff0c;它…

Windows环境下Scala编程环境搭建

不知道多少人和曾经的我一样&#xff0c;对于安装环境搭建一直无脑跟做&#xff0c;报一堆错&#xff0c;无脑百度迟迟才解决&#xff0c;所以懂搭建逻辑&#xff0c;步骤前后关系是非常&#xff0c;非常&#xff0c;非常重要的&#xff0c;所以接下来我会先讲逻辑&#xff0c;…

刚刚,OpenAI官方发文驳斥马斯克,自曝8年间邮件往来截图

文章开篇表示&#xff1a;「OpenAI 的使命是确保 AGI 惠及全人类&#xff0c;这意味着既要构建安全、有益的 AGI&#xff0c;又要帮助创造广泛的利益。我们正在分享我们在实现使命方面所学到的知识&#xff0c;以及有关我们与马斯克关系的一些事实。我们打算驳回马斯克的所有主…

GEE 高阶应用——在GEE code editor加载不同了底图(使用Snazzy Maps外界包)

简介 这里我们需要引入一个require()函数来获取这个包来添加到你添加的编程界面中,然后你就可以获取不同款式的地图。 在任何脚本或应用程序中自定义地球引擎基图只需一行代码即可通过 URL、名称或标签添加 Snazzy Maps 中的任何样式用于快速、无阻塞执行的异步评估结果 导入…

别再为微信登录烦恼!Xinstall的Universal Links让你秒速直达APP!

微信登录Universal Links校验不通过&#xff1f;无法直达APP场景页面&#xff1f;别担心&#xff0c;Xinstall来帮你解决这一难题&#xff01; 随着移动互联网的迅猛发展&#xff0c;App已成为我们日常生活中不可或缺的一部分。而微信&#xff0c;作为拥有十亿用户的社交巨头…

geoserver+mapbox-gl 离线部署矢量切片地图服务学习笔记

geoserver安装 geoserver的安装包可以在官网下载Download - GeoServer&#xff0c;想要选择版本点击Archived找到指定版本进行下载http://geoserver.org/download/ &#xff08;如果网络不稳定&#xff0c;也可以直接使用下面的下载地址&#xff09; geoserver-2.15.0.rar资…

python基础练习题目

1. 根据身高体重&#xff0c;判断人的胖瘦 描述&#xff1a; 通过身高和体重&#xff0c;判断一个人的胖瘦。国际上一般采用BMI体重指数&#xff0c;计算公式为BMI 体重 / 身高2(保留小数点后1位)&#xff0c;参考标准如下&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪…

完美解决VMware中配置suse10虚拟机网络

一、注意&#xff01;&#xff01;&#xff01;配置suse10网络&#xff0c;需要在虚拟机关机状态下进行&#xff0c;否则会配置不成功&#xff1b; 二、配置与主机在同一网段(仅主机模式&#xff0c;网卡一)&#xff1b; 在suse系统关机状态下&#xff0c;Vmware中设置”虚拟网…