当前位置: 首页 > 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 动机 我们以前都见过这样的情况——代码覆盖率不断下降的项目——部署起来越来越可怕,而且像朝鲜一样…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...