【LeetCode-中等】剑指 Offer 29. 顺时针打印矩阵(详解)

news2025/2/27 16:29:56

题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 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]

剑指 Offer 29. 顺时针打印矩阵 - 力扣(LeetCode)

与 力扣54题相同

54. 螺旋矩阵

思路

二维数组顺时针从外往里走

可以想象成:按照 右-》下-》左 -》上 的顺序一直走,走过的地方不要走即可。

 

1. 每走过一个地方,就标记一下,这样下次就不会再走这里了

2. 循环往右走,直到不能走为止(不能走:既不超出数组边界,并且下一个地方没有走过的标记)

3. 循环往下走,直到不能走为止

4. 循环往左走,直到不能走为止

5. 循环往上走,直到不能走为止

6. 重复2345这四步,直到四面八方没有一个地方可以走

代码

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        int i = 0;
        int j = 0;
        int m = matrix.length;
        if (m == 0)return new int[0];
        int n = matrix[0].length;
        int passingFlag = Integer.MIN_VALUE;
        int res [] = new int[m * n];
        int p = 0;
        res[p] = matrix[i][j];
        matrix[i][j] = passingFlag;

        //上下左右有一个地方能走就行
        while ((j+1< n && matrix[i][j+1] != passingFlag)||  (i+1< m && matrix[i+1][j] != passingFlag) || (j - 1 >= 0 && matrix[i][j - 1] != passingFlag) || (i - 1 >= 0 && matrix[i-1][j] != passingFlag)){

            //往右走
            while (j+1< n && matrix[i][j+1] != passingFlag){
                j = j + 1;
                p++;
                res[p] = matrix[i][j];
                matrix[i][j] = passingFlag;
            }
            //往下走
            while (i+1< m && matrix[i+1][j] != passingFlag){
                i = i + 1 ;
                p++;
                res[p] = matrix[i][j];
                matrix[i][j] = passingFlag;

            }
            //往左走
            while (j - 1 >= 0 && matrix[i][j - 1] != passingFlag){
                j = j - 1;
                p++;
                res[p] = matrix[i][j];
                matrix[i][j] = passingFlag;

            }
            //往上走
            while (i - 1 >= 0 && matrix[i-1][j] != passingFlag){
                i = i - 1;
                p++;
                res[p] = matrix[i][j];
                matrix[i][j] = passingFlag;

            }
        }
        return res;

    }
}

效果

 

可以优化的地方:

1.走过标记

        走过的标记,这里我使用的是:走过一个地方就让那里变成最小值Integer.MIN_VALUE,但是这么做不严谨,因为测试例子里没有走过最小值,所以我通过了。

        官方的做法是:用一个辅助矩阵,也就是再做一个二维数组,走过原数组,就在辅助数组上标记一下,这么做才合情合理。

2.结束条件

        判断外层大循环结束,我的条件是只要四面八方都不能走了,就停止。

        官方的结束条件是,只要结果数组满了,就结束。

        这样看来 官方的解法要比我少判断一些东西。

也就是将

        while ((j+1< n && matrix[i][j+1] != passingFlag)||  (i+1< m && matrix[i+1][j] != passingFlag) || (j - 1 >= 0 && matrix[i][j - 1] != passingFlag) || (i - 1 >= 0 && matrix[i-1][j] != passingFlag)){

替换成

        while (p+1 < m*n){

代码会简洁很多

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

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

相关文章

【前端 | CSS】滚动到底部加载,滚动监听、懒加载

背景 在日常开发过程中&#xff0c;我们会遇到图片懒加载的功能&#xff0c;基本原理是&#xff0c;滚动条滚动到底部后再次获取数据进行渲染。 那怎么判断滚动条是否滚动到底部呢&#xff1f;滚动条滚动到底部触发时间的时机和方法又该怎样定义&#xff1f; 针对以上问题我…

WinServer2016 DHCPv6部署

Windows Server 2016 部署 DHCPv6 应用场景&#xff1a;如果服务器的 idrac 地址配置之后忘记了&#xff0c;又无法不能重启服务器&#xff0c;可以通过 DHCPv6 来解决。因为服务器 idrac 的 ipv6 自动获取是默认开启的&#xff0c;那么可以用笔记本装个 windwos server 的系统…

Vue2 实现购物车功能(可直接使用)

目录 vue2.0实例简单购物车代码实现 vue2.0实例简单购物车 页面展示效果如下&#xff1a;​ 该购物车实现了自动计算小计、总价。 代码实现 <body><div id"app"><div><form action"">商品名称:<input type"text" …

卡巴斯基为基于Linux的嵌入式设备推出专用解决方案

导读卡巴斯基在其卡巴斯基嵌入式系统安全产品中引入了对 Linux 的支持。这种适应性强的多层解决方案现在为基于Linux的嵌入式系统、设备和场景提供优化的安全&#xff0c;合通常适用于这些系统的严格监管标准。 卡巴斯基在其卡巴斯基嵌入式系统安全产品中引入了对 Linux 的支持…

编程小白必看!Visual Studio 2022详细安装使用教程(C/C++编译器)

目录 【前言】 一、Visual Studio 2022简介 二、Visual Studio 2022下载安装 1.Visual Studio 2022下载地址 2.Visual Studio 2022安装 2.1下载完成后点击打开安装 2.2安装完毕以后需要重启软件&#xff0c;点击确定。 三、Visual Studio 2022使用教程 【最后】 &#x…

分享一颗能用在TYPE-C接口取电协议芯片LDR6328Q,方便好用

芯片功能&#xff1a;诱导PD充电器输出最大功率&#xff0c;支持最大诱骗20V电压。支持协议&#xff1a;PD/QC/三星AFC/华为SCP等主流快充协议 芯片封装&#xff1a;QFN16,SOP8多封装选择 芯片应用&#xff1a; 桶形连接器替换&#xff08;BCR&#xff09;&#xff0c;USB-A和m…

ABAP: SQL 多值查询

基础查数据 问题举例&#xff1a;例如查物料类型为ZFRT、ZROH和ZRSA的物料编码。 1、直接查询&#xff0c;三种不同类型的物料类型是或的关系。 SELECT DISTINCT ma~matnr ma~mtartFROM mara AS maINNER JOIN mbewh AS mbON ma~matnr mb~matnrINTO CORRESPONDING FIELDS OF…

模型训练----将日志输出为txt

1、写入txt 在云服务器上训练模型的时候&#xff0c;防止不显示输出&#xff0c;可以将训练日志写入txt import logging#初始化文件&#xff0c;filemodew每次覆盖文件 logging.basicConfig(filename./log.txt,format %(asctime)s - %(name)s - %(levelname)s - %(message)s-…

笔记本电脑合上盖后重新打开(秒开)处理方案

原因&#xff1a;合上盖默认进入休眠&#xff0c;电脑内存进入运存&#xff0c;重新打开数据重新传入内存&#xff0c;时间很长&#xff0c; 方案&#xff1a;将休眠模式改为从不即可

机器学习模型的可解释性:增加对人工智能系统的信任和理解

为了以道德和值得信赖的方式使用人工智能&#xff0c;研究人员必须继续创建平衡模型复杂性和易于解释的方法。 机器学习模型在各个领域的使用都取得了重大进展&#xff0c;包括自然语言处理、生成式人工智能和自主系统等。另一方面&#xff0c;随着模型复杂性和规模的增加&…

山东布谷科技直播平台搭建游戏开发技术分享:数据存储的重要意义

在市场上的热门的直播平台中&#xff0c;有很多小程序为用户提供各种各样的功能&#xff0c;这其中就有很多游戏小程序&#xff0c;当今社会独生子女众多&#xff0c;很多作为独生子女的用户都会去选择一个能够社交互动的APP来填补内心的空虚&#xff0c;而直播平台的实时互动的…

python自动化测试框架unittest与pytest的区别

前言&#xff1a; 有使用过unittest单元测试框架&#xff0c;再使用pytest单元测试框架&#xff0c;就可以明显感觉到pytest比unittest真的简洁、方便很多。 unittest与pytest的区别&#xff1a; 主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行…

day24-106.从中序与后序遍历序列构造二叉树

106.从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&am…

CentOS 7 下 Keepalived + Nginx 实现双机高可用

CentOS 7 下 Keepalived Nginx 实现双机高可用 文章目录 CentOS 7 下 Keepalived Nginx 实现双机高可用服务器准备服务信息服务架构 服务安装nginxKeepalived 服务配置nginxKeepalived 启动服务nginxkeepalived 服务验证查看 VIP 状态CURL 命令访问浏览器访问 高可用验证停止…

自动拆箱与装箱

自动拆箱与装箱 先进行专栏介绍自动拆箱与装箱是Java语言中一个重要的特性&#xff0c;它们在编程过程中起着至关重要的作用。本文将深入探讨自动拆箱与装箱的原理和相关细节。概念基本概念分析 原理自动拆箱的原理自动装箱的原理总结 注意事项代码示例 先进行专栏介绍 本专栏…

(三十五)ArcMap创建最小边界几何

ArcMap数据管理——创建最小边界几何 目录 ArcMap数据管理——创建最小边界几何1.概念2.插图3.几何类型4.组选项(可选)5.将几何特征作为属性添加输出中 (可选)1.概念 创建包含若干面的要素类,用以表示封闭单个输入要素或成组的输入要素指定的最小边界几何。 2.插图 输出最…

数据可视化工具LightningChart .NET正式发布v10.5.1——拥有全新的3D新功能

LightningChart.NET完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学…

基于esp32设计多功能应用卡片appcard

基于esp32的多功能应用卡片,支持时钟天气,粉丝计数器,闹钟,倒计日,游戏,电子书,图片,视频,新闻,股票,离线模式等功能。 硬件部分及程序烧录: 一,pcb和电路图直接见开源项目,附件中有Gerber文件可直接打板。 1,pcb打板要求,板子厚度1.6mm,其他无要求 二,元…

详解很多公司都在用的国产分布式任务调度框架:XXL-JOB

1.简介 1.1 Quartz的不足 之前我们讲述了分布式任务调度任务框架老大哥&#xff1a;Quartz&#xff0c;但是Quartz 使用起来也比较麻烦&#xff0c;不尽人意。个人总结其使用缺点如下&#xff1a; Quzrtz 并没有内置 UI 管理控制台&#xff0c;导致任务动态管理不够友好调用…

nginx动态同步配置模块nginx-upsync-module

使用场景简介 nginx一般直接在配置文件里配置upstream即可实现负载均衡&#xff0c;但有些特定的环境下此种方式就显得有些局限性。比如后台动态调整节点的时候&#xff1b;调整节点后不想修改配置文件重启nginx。 可以将配置文件从nginx本地迁移到其他第三方服务上如etcd、c…