当前位置: 首页 > news >正文

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

题目

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

示例 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){

代码会简洁很多

相关文章:

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

题目 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,4],[5,6,7,8],[9,10,1…...

TOMCAT基础

tomcat是一个基于Java开发的&#xff0c;开放源代码的web应用服务器。它可以解析html页面中的java代码&#xff0c;执行动态请求&#xff0c;实现动态页面。核心功能是将收到的http请求处理并转发给适当的servlet来处理&#xff0c;然后将响应返回给客户端。 优点 1&#xff0c…...

自动化集装箱码头建设指南

1 总则 1.0.1 为规范和指导自动化集装箱码头建设&#xff0c;提高自动化集装箱码头建设和装卸自动化应用水平&#xff0c;做到技术先进、经济合理、安全可靠、高效节能、绿色环保&#xff0c;制定本指南。 1.0.2本指南适用于新建、改建和扩建自动化集装箱码头的设计&#xff0…...

为什么要用redis

高性能 就是把你一些复杂操作耗时查出来的结果(用了600ms)&#xff0c;如果确定后面不咋变了&#xff0c;然后但是马上还有很多读请求&#xff0c;那么直接结果放缓存(6ms)&#xff0c;后面直接读缓存就好了。 这样&#xff0c;性能就提升了100倍 高并发 说白了就是&#xf…...

QT qmake解析

...

【TypeScript】this指向,this内置组件

this类型 TypeScript可推导的this类型函数中this默认类型对象中的函数中的this明确this指向 怎么指定this类型 this相关的内置工具类型转换ThisParameterType<>ThisParameterType<>ThisType TypeScript可推导的this类型 函数中this默认类型 对象中的函数中的this…...

MySQL 深度分页优化

MySQL 深度分页优化 理解总结&#xff1a; 分页使用limit &#xff0c;前提是要排序好的数据&#xff0c;这时候&#xff0c;就推荐使用带索引的字段排序&#xff0c;因为索引是天然有序的&#xff0c;不需要像是无序的字段一样&#xff0c;全表扫描&#xff0c;如果太大的话…...

如何在CSS中水平居中一个元素?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 margin: 0 auto⭐ 使用 Flexbox 布局⭐ 使用绝对定位和负边距⭐ 使用表格布局⭐ 使用网格布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅…...

生信豆芽菜-ESTIMATE预测免疫评分

网址&#xff1a;http://www.sxdyc.com/immuneEstimateScore 一、ESTIMATE预测免疫评分介绍 ESTIMATE&#xff08;Estimation of STromal and Immune cells in MAlignant Tumor tissues using Expression data&#xff09;是一种用于预测肿瘤免疫评分的计算方法。它通过分析基因…...

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

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

【java】Java与SQLite3数据库类型之间对应关系

引 在开发应用程序时&#xff0c;经常需要将数据存储到数据库中。SQLite3 是一种轻量级的嵌入式数据库&#xff0c;广泛应用于移动设备和嵌入式系统。在使用 SQLite3 数据库时&#xff0c;了解 Java 数据类型与 SQLite3 数据库类型之间的对应关系非常重要&#xff0c;以便正确…...

ELK常见部署架构以及出现的问题及解决方案

ELK常见部署架构以及出现的问题及解决方案 ELK 已经成为目前最流行的集中式日志解决方案&#xff0c;它主要是由Beats 、Logstash 、Elasticsearch 、 Kibana 等组件组成&#xff0c;来共同完成实时日志的收集&#xff0c;存储&#xff0c;展示等一站式的解决方案。本文将会介…...

windows使用vscode配置java开发环境

安装JDK 下载windows版本的JDK&#xff0c;解压到一个目录 openJDK下载地址&#xff1a;Archived OpenJDK GA Releases (java.net) 下载 Microsoft Build of OpenJDK | Microsoft Learn 添加环境变量&#xff1a;JAVA_HOME&#xff1a;JDK的解压目录 编辑PATH&#xff1a;…...

centos系统kubeadm安装K8S_v1.27.x容器使用docker(K8S_v1.24版本以后依然使用docker容器管理)

kubeadm安装K8S_v1.27.x容器使用docker 按照需要的文档点击这里下载 一.环境部署 1.1基础环境配置 主机IP 主机名规划 192.168.186.128 k8s-master01 192.168.186.129 k8s-node01 192.168.186.130 k8s-node02 1.2修改机器名称 #永久修改主机名 hostnamectl set-hostname …...

如何使用索引加速 SQL 查询 [Python 版]

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑器的3D应用场景 假设您正在筛选一本书的页面。而且您希望更快地找到所需的信息。你是怎么做到的&#xff1f;好吧&#xff0c;您可能会查找术语索引&#xff0c;然后跳转到引用特定术语的页面。SQL 中的索引的工作方…...

Oracle 开发篇+Java通过DRCP访问Oracle数据库

标签&#xff1a;DRCP、Database Resident Connection Pooling、数据库驻留连接池释义&#xff1a;DRCP&#xff08;全称Database Resident Connection Pooling&#xff09;数据库驻留连接池&#xff08;Oracle自己的数据库连接池技术&#xff09; ★ Oracle开启并配置DRCP sq…...

在安装 ONLYOFFICE 协作空间社区版时如何使用额外脚本参数

ONLYOFFICE 协作空间社区版是免费的文档中心工具&#xff0c;可帮助您将用户与文档聚合至同一处&#xff0c;提高协作效率。 ONLYOFFICE 协作空间主要功能 使用 ONLYOFFICE 协作空间&#xff0c;您可以&#xff1a; 邀请他人&#xff0c;协作和沟通完成工作创建协作房间&…...

ChatGPT在智能家居控制和环境管理中的应用如何?

智能家居控制和环境管理是近年来在科技领域迅速发展的重要领域之一。智能家居技术通过将物联网、人工智能和自动化技术相结合&#xff0c;实现了家居设备的智能化、自动化控制和远程管理。ChatGPT作为强大的自然语言处理模型&#xff0c;在智能家居控制和环境管理方面具有广泛的…...

理解 Go 中的切片:append 操作的深入分析(篇2)

理解 Go 语言中 slice 的性质对于编程非常有益。下面&#xff0c;我将通过代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。 本篇为第 2 篇&#xff0c;当切片的容量 cap 不够时 func main() {// slice1 当前长度为 3&#xff0c;容量大小也为 3slice1 :…...

GPT-4 如何为我编写测试

ChatGPT — 每个人都在谈论它,每个人都有自己的观点,玩起来很有趣,但我们不是在这里玩— 我想展示一些实际用途,可以帮助您节省时间并提高效率。 我在本文中使用GPT-4 动机 我们以前都见过这样的情况——代码覆盖率不断下降的项目——部署起来越来越可怕,而且像朝鲜一样…...

CDN 报错 403/502/504 怎么解决?源站与防护策略排查

网站接入CDN后&#xff0c;原本访问流畅&#xff0c;突然出现403、502、504报错&#xff0c;用户反馈无法访问&#xff0c;自己排查半天找不到头绪——其实这类报错大多和「源站状态」「防护策略」「CDN配置」三个环节相关&#xff0c;今天就结合实操经验&#xff0c;把这三种常…...

7个终极技巧:提升SwiftyUserDefaults性能,避开常见陷阱

7个终极技巧&#xff1a;提升SwiftyUserDefaults性能&#xff0c;避开常见陷阱 【免费下载链接】SwiftyUserDefaults Modern Swift API for NSUserDefaults 项目地址: https://gitcode.com/gh_mirrors/sw/SwiftyUserDefaults SwiftyUserDefaults是一个为NSUserDefaults提…...

避坑指南:STM32输入捕获测量PWM时,如何处理计数器溢出的3种方案

STM32输入捕获测量PWM时的计数器溢出处理方案实战解析 在嵌入式系统开发中&#xff0c;精确测量PWM信号的频率和占空比是常见需求。STM32系列微控制器的输入捕获功能为此提供了硬件支持&#xff0c;但当PWM周期较长或测量高分辨率信号时&#xff0c;定时器计数器(CNT)溢出问题往…...

虚拟机异常断电后卡在initramfs阶段?手把手教你用xfs_repair修复系统分区

1. 虚拟机异常断电的常见后果 最近在调试一个基于KVM的虚拟机集群时&#xff0c;遇到了一个典型问题&#xff1a;机房突然断电后&#xff0c;几台虚拟机重启时卡在了initramfs阶段&#xff0c;屏幕上不断刷出"generating /run/initramfs/rdsosreport.txt"的提示。这种…...

高效实用的Notepad2文本编辑器:从入门到精通的全方位指南

高效实用的Notepad2文本编辑器&#xff1a;从入门到精通的全方位指南 【免费下载链接】notepad2 Notepad2-zufuliu is a light-weight Scintilla based text editor for Windows with syntax highlighting, code folding, auto-completion and API list for many programming l…...

保姆级教程:用MuJoCo的add_marker给你的机械臂末端轨迹画条‘光带’

机械臂轨迹可视化进阶&#xff1a;用MuJoCo打造动态光带效果 在机器人仿真领域&#xff0c;轨迹可视化不仅是调试工具&#xff0c;更是展示算法优雅性的窗口。想象一下&#xff0c;当你的机械臂在三维空间划出流畅运动时&#xff0c;一条如彗尾般渐变的彩色光带随之延展&#x…...

Power BI视觉对象交互设计秘籍--巧用书签按钮实现动态提示

1. 为什么需要动态提示功能&#xff1f; 做数据分析报表最怕什么&#xff1f;不是数据不准&#xff0c;而是看报表的人看不懂。我见过太多这样的场景&#xff1a;精心设计的柱状图被用户误读&#xff0c;复杂的折线图被理解成完全相反的趋势。这时候你会想&#xff0c;要是有个…...

【实战】VSCode插件离线安装全攻略:从下载到部署

1. 为什么需要离线安装VSCode插件 作为一名在开发一线摸爬滚打多年的老码农&#xff0c;我遇到过太多因为网络问题导致插件安装失败的场景。比如去年在某大型制造企业的工厂MES系统升级项目中&#xff0c;开发环境完全隔离外网&#xff0c;但团队又急需使用GitLens和Python插件…...

BERT自然语言处理模型:从入门到实践完整指南

BERT自然语言处理模型&#xff1a;从入门到实践完整指南 【免费下载链接】bert TensorFlow code and pre-trained models for BERT 项目地址: https://gitcode.com/gh_mirrors/be/bert BERT&#xff08;Bidirectional Encoder Representations from Transformers&#x…...

告别996!用Google Antigravity的Agent-First模式,5分钟搞定React Native与Android原生桥接模块

告别996&#xff01;用Google Antigravity的Agent-First模式&#xff0c;5分钟搞定React Native与Android原生桥接模块 如果你是一位长期奋战在Android与React Native混合开发一线的工程师&#xff0c;一定对"桥接模块"这个词汇又爱又恨。每当产品经理提出"我们…...