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

Leetcode 54: 螺旋矩阵

Leetcode 54: 螺旋矩阵 是一道经典的矩阵遍历模拟题目,要求我们以螺旋顺序遍历一个二维数组。这个问题在面试中非常经典,考察模拟、数组操作以及逻辑清晰度。掌握本题的高效解法可以迅速给面试官留下好印象。


适合面试的解法:边界法(层级遍历)

解法描述

  1. 核心思想:一次遍历一圈,按四个边界移动指针
    • 定义四个边界:top, bottom, left, right,分别表示当前未遍历层的上边界、下边界、左边界和右边界。
    • 遍历一圈后,逐步缩小边界范围,直到所有元素都被处理。
  2. 边界调整规则:
    • 从左到右遍历上侧top 行),然后 top++
    • 从上到下遍历右侧right 列),然后 right--
    • 如果还有未遍历的行,则 从右到左遍历底侧bottom 行),然后 bottom--
    • 如果还有未遍历的列,则 从下到上遍历左侧left 列),然后 left++
    • 每次遍历完一圈,都缩小边界范围。
  3. 终止条件:
    • top > bottomleft > right 时,说明所有元素都已访问。

代码模板

import java.util.*;class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result = new ArrayList<>();if (matrix == null || matrix.length == 0) return result;int top = 0, bottom = matrix.length - 1; // 上下边界int left = 0, right = matrix[0].length - 1; // 左右边界while (top <= bottom && left <= right) {// 从左到右遍历上边界for (int i = left; i <= right; i++) {result.add(matrix[top][i]);}top++; // 上边界缩小// 从上到下遍历右边界for (int i = top; i <= bottom; i++) {result.add(matrix[i][right]);}right--; // 右边界缩小// 检查是否还有未遍历的行if (top <= bottom) {// 从右到左遍历下边界for (int i = right; i >= left; i--) {result.add(matrix[bottom][i]);}bottom--; // 下边界缩小}// 检查是否还有未遍历的列if (left <= right) {// 从下到上遍历左边界for (int i = bottom; i >= top; i--) {result.add(matrix[i][left]);}left++; // 左边界缩小}}return result;}
}

复杂度分析

  1. 时间复杂度:O(m * n)
    • 访问每个元素一次,m 为行数,n 为列数。
  2. 空间复杂度:O(1)(不计算结果集)
    • 原地遍历,无需额外空间。

适用场景

  • 面试首选解法:
    • 模拟问题逻辑清晰,层次分明,行为可解释。
    • 高效,简单易实现,能快速写出来。
  • 面试中可以结合剪枝优化、边界调整等细节,展示代码能力。

其他解法及分析

解法 2:模拟法


该解法直接按照螺旋的变化顺序(右 -> 下 -> 左 -> 上)模拟移动,通过控制方向实现遍历。

思路
  1. 定义方向和边界:
    • 使用方向数组 dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)] 表示右、下、左、上的顺序;
    • 通过一个 dirIndex 控制当前的方向(如 dirIndex = 0 表示向右,dirIndex = 1 表示向下)。
    • 定义已经访问过的区域,并使用二维 visited 数组记录已经访问的元素。
  2. 遍历矩阵:
    • (0, 0) 点开始,模拟按照当前方向移动;
    • 如果即将移动超出边界或者已经访问过,切换到下一个方向;
    • 直到所有元素遍历完为止。

代码模板
class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result = new ArrayList<>();if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return result;int m = matrix.length, n = matrix[0].length;boolean[][] visited = new boolean[m][n]; // 记录访问情况// 定义方向数组(右、下、左、上)int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int dirIndex = 0; // 当前方向int row = 0, col = 0; // 当前坐标for (int i = 0; i < m * n; i++) {result.add(matrix[row][col]);visited[row][col] = true;// 计算下一个位置int nextRow = row + dirs[dirIndex][0];int nextCol = col + dirs[dirIndex][1];// 如果越界或已经访问过,改变方向if (nextRow < 0 || nextRow >= m || nextCol < 0 || nextCol >= n || visited[nextRow][nextCol]) {dirIndex = (dirIndex + 1) % 4; // 顺时针切换方向nextRow = row + dirs[dirIndex][0];nextCol = col + dirs[dirIndex][1];}row = nextRow;col = nextCol;}return result;}
}

复杂度分析

  1. 时间复杂度:O(m * n)
    • 每个元素遍历一次。
  2. 空间复杂度:O(m * n)
    • 使用了 visited 二维数组记录访问情况。

适用场景

  • 如果面试官要求实现更灵活的模拟法,则此解法是合适的替代。
  • 不过,由于需要额外的 visited 数组,其空间复杂度较高,不是首选。

快速AC总结

推荐解决方案

  1. 优先使用:边界法(解法 1)
    • 模拟螺旋顺序,根据边界进行缩小调整;
    • 代码简洁高效,容易直接实现,完全满足面试需求。
  2. 备选模拟法(解法 2)
    • 如果需要通过灵活控制方向和遍历行为进行实现,此解法较为通用,但需要额外空间。

在面试中如何快速AC

  1. 清晰描述解法:
    • 解释如何依次遍历每一圈,使用上下左右边界标记矩阵;
    • 让面试官了解整个遍历顺序和边界调整的逻辑。
  2. 快速实现代码:
    • 边界法(解法 1) 适合作为首选;
    • 模拟移动的代码少且简洁,更容易写。
  3. 关注边界条件:
    • 注意矩阵为空的情况;
    • 单行单列、非方阵等特殊情况要覆盖。

通过掌握这两种解法,能够灵活应对问题,并快速在面试中实现清晰的解答,获得面试官肯定!

相关文章:

Leetcode 54: 螺旋矩阵

Leetcode 54: 螺旋矩阵 是一道经典的矩阵遍历模拟题目&#xff0c;要求我们以螺旋顺序遍历一个二维数组。这个问题在面试中非常经典&#xff0c;考察模拟、数组操作以及逻辑清晰度。掌握本题的高效解法可以迅速给面试官留下好印象。 适合面试的解法&#xff1a;边界法&#xff…...

abseil-cpp:环境搭建

参考: https://abseil.io/docs/cpp/quickstart-cmake abseil-cpp.git/dd4c89b abseil-cpp.git/20240722.1 1. clone代码仓库、编译 git clone https://github.com/abseil/abseil-cpp.git /app/abseil-cpp/ #/app/abseil-cpp/.git/config git checkout 20240722.1git rev-pa…...

Centos7部署k8s(单master节点安装)

单master节点部署k8s集群(Centos) 一、安装前准备 1、修改主机名 按照资源准备修改即可 # master01 hostnamectl set-hostname master01 ; bash # node1 hostnamectl set-hostname node1 ; bash # node2 hostnamectl set-hostname node2 ; bash2、修改hosts文件 以下命令所…...

RPA 职业前景:个人职场发展的 “新机遇”

1. RPA职业定义与范畴 1.1 RPA核心概念 机器人流程自动化&#xff08;RPA&#xff09;是一种通过软件机器人模拟人类操作&#xff0c;自动执行重复性、规则性任务的技术。RPA的核心在于其能够高效、准确地处理大量数据和流程&#xff0c;减少人工干预&#xff0c;从而提高工作…...

详解DeepSeek模型底层原理及和ChatGPT区别点

一、DeepSeek大模型原理 架构基础 DeepSeek基于Transformer架构,Transformer架构主要由编码器和解码器组成,在自然语言处理任务中,通常使用的是Transformer的解码器部分。它的核心是自注意力机制(Self - Attention),这个机制允许模型在处理输入序列时,关注序列中不同位…...

《2025年软件测试工程师面试》JAVA基础面试题

基础题 == 和 equals 的区别是什么? ==比较的是引用是否相同,比较的是对象的引用地址,如果比较的两个对象地址位不同,值相同也会返回falseequals()比较的是...

【算法学习之路】5.贪心算法

贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳&#xff01;3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也写了几篇&#xff0c;题单正在更新&#xf…...

如何打造一个安全稳定的海外社媒账号?

您好&#xff01;随着TikTok、Instagram、Facebook等海外社媒平台的迅猛发展&#xff0c;越来越多的个人和企业希望借助这些平台实现全球化传播。然而&#xff0c;注册和运营海外社媒账号的过程中&#xff0c;许多人频繁遭遇到封禁、限制和账号关联等问题&#xff0c;常常导致严…...

【Python 数据结构 5.栈】

目录 一、栈的基本概念 1.栈的概念 2.入栈 入栈的步骤 3.出栈 出栈的步骤 4.获取栈顶元素 获取栈顶元素的步骤 二、 Python中的栈 顺序表实现 链表实现 三、栈的实战 1.LCR 123. 图书整理 I 思路与算法 2.LCR 027. 回文链表 思路与算法 3.1614. 括号的最大嵌套深度 思路与算法 …...

Qt开发⑪Qt网络+Qt音视频_使用实操

目录 1. Qt 网络 1.1 UDP Socket 1.2 TCP Socket 1.3 HTTP Client 2. Qt 音视频 2.1 Qt 音频 2.2 Qt 视频 本篇完。 1. Qt 网络 和多线程类似&#xff0c;Qt 为了支持跨平台, 对网络编程的 API 也进行了重新封装。 实际 Qt 开发中进行网络编程&#xff0c;也不一定使用…...

JavaEE--计算机是如何工作的

一、一台计算机的组成部分 1.CPU&#xff08;中央处理器&#xff09; 2.主板&#xff08;一个大插座&#xff09; 3.内存&#xff08;存储数据的主要模板&#xff09; 4.硬盘&#xff08;存储数据的主要模板&#xff09; 内存和硬盘对比&#xff1a; 内存硬盘读写速度快慢存…...

API接口:企业名称、注册号、统一社会信用代码、企业类型、成立日期和法定代表人等数据 API 接口使用指南

API接口&#xff1a;企业名称、注册号、统一社会信用代码、企业类型、成立日期和法定代表人等数据 API 接口使用指南 本文详细介绍一种基于 Web 搜索方式实现的企业信息查询接口&#xff0c;适用于数据补全、企业资质验证、信息查询等场景。文章内容涵盖接口功能、请求参数、返…...

微信小程序text组件decode属性的小问题

今天学习微信小程序的text组件&#xff0c;这个组件类似于网页制作中的span标签&#xff0c;内联文本只能用 text 组件&#xff0c;不能用 view&#xff0c;如 foo bar </text。 text组件常用属性如下表&#xff1a; 属性说明user-select文本是否可选&#xff0c;该属性会使…...

【计算机网络入门】初学计算机网络(九)

目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 ​编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术&#xff0c;多个主机形成…...

LeetCode 974:和可被 K 整除的子数组

974. 和可被 K 整除的子数组 - 力扣&#xff08;LeetCode&#xff09; 给定一个整数数组 nums 和一个整数 k &#xff0c;返回其中元素之和可被 k 整除的非空 子数组 的数目。 子数组 是数组中 连续 的部分。 示例 1&#xff1a; 输入&#xff1a;nums [4,5,0,-2,-3,1], k …...

vector习题

完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…...

001-码云操作

码云操作 一、配置公钥1.官网地址1.进入 git bash2.查看生成的公钥3.设置到 Gitee4.测试 二、初始化一个项目1.新建仓库 一、配置公钥 方便后续提交代码不用填写密码 1.官网地址 官网地址&#xff1a;https://gitee.com/Git码云教程&#xff1a;https://gitee.com/help/arti…...

数据结构:二叉搜索树(排序树)

1.二叉搜索树的定义 二叉搜索树要么是空树&#xff0c;要么是满足以下特性的树 &#xff08;1&#xff09;左子树不为空&#xff0c;那么左子树左右节点的值都小于根节点的值 &#xff08;2&#xff09;右子树不为空&#xff0c;那么右子树左右节点的值都大于根节点的值 &#…...

【愚公系列】《Python网络爬虫从入门到精通》036-DataFrame日期数据处理

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

C++(蓝桥杯常考点)

前言&#xff1a;这个是针对于蓝桥杯竞赛常考的C内容&#xff0c;容器这些等下棋期再讲 C 在DEVC中注释和取消注释的方法&#xff1a;ctrl/ ASCII值&#xff08;常用的&#xff09;&#xff1a; A-Z:65-90 a-z:97-122 0-9:48-57 换行/n:10科学计数法&#xff1a;eg&#xff1a…...

影墨·今颜模型API接口开发与调用全指南

影墨今颜模型API接口开发与调用全指南 你是不是已经成功部署了影墨今颜模型&#xff0c;看着它能在本地生成惊艳的图片&#xff0c;心里正盘算着怎么把它变成一个能对外服务的“产品”&#xff1f;比如&#xff0c;让公司的设计团队直接调用&#xff0c;或者集成到自己的应用里…...

为什么92%的FastAPI流式AI项目在高并发下崩溃?深度解析event loop争用、response.body迭代器生命周期与uvicorn worker模型冲突

第一章&#xff1a;FastAPI 2.0流式AI响应的高并发失效现象全景透视当FastAPI 2.0被用于承载大语言模型&#xff08;LLM&#xff09;的SSE&#xff08;Server-Sent Events&#xff09;或分块Transfer-Encoding: chunked流式响应时&#xff0c;大量并发请求下常出现连接提前终止…...

PNAS|收入不足对婴儿早期脑发育的影响

本文揭示了逆境在出生后最早期脑发育阶段中的关键作用。基于 Baby Steps 研究&#xff08;一项正在进行的纵向研究&#xff1b;在一所服务于贫困与压力发生率较高家庭的初级保健门诊中采集婴儿脑电&#xff08;EEG&#xff09;与社会经济地位相关数据&#xff09;的数据表明&am…...

AntdUI实战:用WinForm和.NET 6给老旧内部管理系统“换肤”的完整记录

AntdUI实战&#xff1a;用WinForm和.NET 6给老旧内部管理系统“换肤”的完整记录 当企业内部的WinForm系统运行超过十年&#xff0c;那些灰底蓝框的界面早已与现代审美格格不入。去年接手某制造业ERP系统改造时&#xff0c;我面对的是一个基于.NET Framework 4.0的"古董&q…...

开源小模型也能干大事:MinerU图文理解实战教程

开源小模型也能干大事&#xff1a;MinerU图文理解实战教程 1. 项目简介 OpenDataLab MinerU 是一个专门针对文档理解设计的智能多模态模型&#xff0c;基于 OpenDataLab/MinerU2.5-1.2B 模型构建。虽然只有 1.2B 参数&#xff0c;但这个模型在文档解析方面表现出色&#xff0…...

BubbleRAG:破局黑盒图谱,召回精确率双杀

LLMs 在知识密集型任务中普遍存在幻觉问题&#xff0c;且训练数据的静态性导致知识过时。 RAG 通过引入外部知识缓解这一问题&#xff0c;其中基于知识图谱&#xff08;KG&#xff09;的RAG能显式建模跨文档依赖&#xff0c;支持结构化推理。然而&#xff0c;现有方法在黑盒知识…...

别再死记硬背DAQmx流程了!LabVIEW数据采集核心逻辑拆解:以USB-6008正弦波实验为例

从设计模式视角重构LabVIEW数据采集&#xff1a;以USB-6008正弦波实验为例 当LabVIEW新手第一次接触DAQmx数据采集时&#xff0c;往往会被"创建任务→添加通道→配置时钟→开始任务→读取数据→清除任务"的固定流程所困扰。这种机械记忆不仅容易遗忘&#xff0c;更难…...

Vue3+Cesium实战:解决404报错与Webpack配置优化指南

1. 为什么你的Cesium地图总是加载失败&#xff1f; 第一次在Vue3项目里集成Cesium时&#xff0c;我也被那些莫名其妙的404报错搞得焦头烂额。明明按照文档配置了&#xff0c;地图就是不显示&#xff0c;控制台一片红。后来才发现&#xff0c;90%的问题都出在资源路径配置上。 C…...

MoveIt2的KDL插件不好用?手把手教你自定义关节权重,优化机械臂运动优先级

MoveIt2关节权重调优实战&#xff1a;如何让冗余机械臂按你的想法运动 当机械臂的第七个关节开始不受控制地乱转&#xff0c;而前三个关节却几乎不动时&#xff0c;大多数工程师的第一反应是"这IK算法有问题"。但真相往往是&#xff1a;算法没问题&#xff0c;只是它…...

避坑指南:从零搭建Anaconda+CUDA+PyTorch+Pycharm深度学习环境

1. 深度学习环境配置全景图 刚接触深度学习的新手往往会在环境配置这一步卡住好几天。我见过太多人在Anaconda、CUDA、PyTorch的版本兼容性问题上来回折腾&#xff0c;最后连代码都没开始写就放弃了。其实只要理解这四个核心组件的关系&#xff0c;配置过程就会变得清晰很多。 …...