LeetCode54题:螺旋矩阵(原创)
【题目描述】
给你一个
m行n列的矩阵matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 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]提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 10-100 <= matrix[i][j] <= 100
题目链接. - 力扣(LeetCode)
【解题代码】
package array.matrix;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class SpiralOrder {public static void main(String[] args) {int[][] matrix = new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};//int[][] matrix = new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};//int[][] matrix = new int[][]{{3}, {2}};List<Integer> result = new SpiralOrder().spiralOrder(matrix);System.out.println(Arrays.toString(result.toArray()));}public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result = new ArrayList<>();int direction = 0;int x = -1, y = 0;int left = 0, right = matrix[0].length - 1, top = 0, bottom = matrix.length - 1;while (true) {if (direction == 0) {if (x >= right)break;result.add(matrix[y][++x]);if (x == right) {top++;direction = 1;}} else if (direction == 1) {if (y >= bottom)break;result.add(matrix[++y][x]);if (y == bottom) {right--;direction = 2;}} else if (direction == 2) {if (x <= left)break;result.add(matrix[y][--x]);if (x == left) {bottom--;direction = 3;}} else if (direction == 3) {if (y <= top)break;result.add(matrix[--y][x]);if (y == top) {left++;direction = 0;}}}return result;}
}
【解题思路】
根据题目描述思考,所谓顺时针螺旋循序就是以右->下->左->上的方式四个方向循环缩小的方式访问矩阵数据,一直到当前方向走不通为止。循环好理解,而所谓“缩小访问”就是:右方向访问完了,顶部去掉一层,下方向访问完了,右侧去掉一层,左方向访问完了,底部去掉一层,上方向访问完了,左侧去掉一层。把握好这一点,代码逻辑就好实现了,按照这个思路,很快完成代码编写,并提交成功

【解题步骤】
- 定义变量结果集result,访问方向direction,当前访问位置x,y,矩阵上下左右四个边缘值;
List<Integer> result = new ArrayList<>(); int direction = 0; int x = -1, y = 0; int left = 0, right = matrix[0].length - 1, top = 0, bottom = matrix.length - 1; - 外面包一层无限循环来螺旋循序访问矩阵数据
while (true) {... } - 尝试向右方向走,如果一开始就碰壁,那么说明访问结束,直接退出,取当前位置右侧值加入结果集中,如果已经走到最右侧,那么方向改为向下,并将top值加1;
if (direction == 0) {if (x >= right)break;result.add(matrix[y][++x]);if (x == right) {top++;direction = 1;} } - 尝试向下方向走,如果一开始就碰壁,那么说明访问结束,直接退出,取当前位置下侧值加入结果集中,如果已经走到最下侧,那么方向改为向左,并将right值减1;
else if (direction == 1) {if (y >= bottom)break;result.add(matrix[++y][x]);if (y == bottom) {right--;direction = 2;} } - 尝试向左方向走,如果一开始就碰壁,那么说明访问结束,直接退出,取当前位置左侧值加入结果集中,如果已经走到最左侧,那么方向改为向上,并将bottom值减1;
else if (direction == 2) {if (x <= left)break;result.add(matrix[y][--x]);if (x == left) {bottom--;direction = 3;} } - 尝试向右方向走,如果一开始就碰壁,那么说明访问结束,直接退出,取当前位置右侧值,如果已经走到最右侧,那么方向改为向下,并将left值加1;
else if (direction == 3) {if (y <= top)break;result.add(matrix[--y][x]);if (y == top) {left++;direction = 0;} } - 返回结果result
return result;
【思考总结】
- 此题关键点在于顺时针螺旋循序就是以右->下->左->上的方式四个方向循环缩小的方式访问矩阵数据,一直到当前方向走不通为止;
- 所谓“缩小访问”就是:右方向访问完了,顶部去掉一层,下方向访问完了,右侧去掉一层,左方向访问完了,底部去掉一层,上方向访问完了,左侧去掉一层。
- LeetCode解题之前,一定不要看题解,看了就“破功”了!
相关文章:
LeetCode54题:螺旋矩阵(原创)
【题目描述】 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:mat…...
FPGA常见型号
FPGA(现场可编程门阵列)开发板种类繁多,涵盖了从入门级教育用途到高性能工业应用的广泛领域。以下是一些常见的 FPGA 开发板型号及其特点: 1. Xilinx(赛灵思)系列 Xilinx 是 FPGA 领域的领导者之一&#…...
【多模态大模型】FlashAttention in NeurIPS 2022
一、引言 论文: FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 作者: Stanford University 代码: FlashAttention 特点: 该方法提出将Q、K、V拆分为若干小块,使执行注意力时不需要频…...
过滤器doFilter 方法
在Java EE中,过滤器的放行是指在过滤器的 doFilter 方法中调用 FilterChain 对象的 doFilter 方法,将请求传递给下一个过滤器或目标 servlet 进行处理。这个过程可以理解为过滤器的责任链传递。 过滤器的 doFilter 方法 在过滤器中,实现 Fil…...
WPF篇(9)-CheckBox复选框+RadioButton单选框+RepeatButton重复按钮
CheckBox复选框 CheckBox继承于ToggleButton,而ToggleButton继承于ButtonBase基类。 案例 前端代码 <StackPanel Orientation"Horizontal" HorizontalAlignment"Center" VerticalAlignment"Center"><TextBlock Text"…...
【机器学习基础】线性回归
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…...
java基础概念12-二维数组
一、二维数组的定义 二维数组可以被视为数组的数组,即每个元素都是一个数组。 二维数组的应用场景: 当我们需要把数据分组管理的时候,就需要用到二维数组。 二、二维数组的初始化 2-1、静态初始化 阿里巴巴规范手册: // 静态初始…...
56 锐键交换机开局
锐键交换机开局 一 锐键视图切换 1 Ruijie> 用户视图 2 Ruijie# 特权模式 3 Ruijie(config)# 全局配置模式 4 Ruijie(config-if-GigabitEthernet 1/1/1)# 接口配置模式 5 Ruijie(config)#show vlan 6 exit (退出) 7 enable(进入)...
VR虚拟展厅与传统实体展厅相比,有哪些优势?
视创云展虚拟展厅相比传统的实体展厅具有多方面的优势,主要体现在以下几个方面: 1、降低成本: 虚拟展厅无需租赁或建设物理空间,减少了场地、装修和维护等方面的开支。同时,参观者和参展商无需现场参观或布展&#x…...
Vue的事件处理、事件修饰符、键盘事件
目录 1. 事件处理基本使用2. 事件修饰符3. 键盘事件 1. 事件处理基本使用 使用v-on:xxx或xxx绑定事件,其中xxx是事件名,比如clickmethods中配置的函数,都是被Vue所管理的函数,this的指向是vm或组件实例对象 <!DOCTYPE html&g…...
c++单例实践
C单例实践 在日常开发中,虽然太多的单例调用会让代码的耦合度变高,但是例如日志类这种,单例模式就变得非常有。所以这篇文章为大家介绍static 关键字相关知识以及如何实现自己的C单例类。 static关键字 首先让我们请出今天的主角: static。…...
SQL注入实例(sqli-labs/less-9)
0、初始页面 1、爆库名 使用python脚本 def inject_database1(url):name for i in range(1, 20):low 32high 128mid (low high) // 2while low < high:payload "1 and if(ascii(substr(database(),%d,1)) > %d ,sleep(2),0)-- " % (i, mid)res {"…...
http不同类型方法的作用,get和post区别
在HTTP协议中,不同的请求方法用于不同的操作。常见的HTTP方法包括GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH等,每种方法有其特定的作用。 常见的HTTP方法及其作用 1. GET - **作用**: 从服务器请求指定资源。GET方法通常用于获取数据而不会修改数据…...
# 利刃出鞘_Tomcat 核心原理解析(二)
利刃出鞘_Tomcat 核心原理解析(二) 一、 Tomcat专题 - Tomcat架构 - HTTP工作流程 1、Http 工作原理 HTTP 协议:是浏览器与服务器之间的数据传送协议。作为应用层协议,HTTP 是基于 TCP/IP 协议来传递数据的(HTML文件…...
美团秋招笔试第三题(剪彩带)求助帖
题目描述及代码如下。 我使用模拟打表法,示例通过了,但是提交通过率为0。诚心求教。欢迎补充题目,或者有原题链接更好~。我觉得可能出错的点:int -> long long ?或者一些临界条件。 /* 美团25毕业秋招第三题,做题…...
LeetCode 算法:最小栈 c++
原题链接🔗:最小栈 难度:中等⭐️⭐️ 题目 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推…...
【解压既玩】PS3模拟器v0.0.32+战神3+战神升天+各存档 整合包 ,完美不死机,没有BUG,旷世神作,强力推荐
战神3是圣莫尼卡公司的大作,PS3 上必玩的游戏之一。 本文收集了战神3和升天两作,附存档,完美不死机,没有BUG,强烈推荐。 解压即玩。 立即下载:【chumenx.com】【解压既玩】PS3模拟器v0.0.32战神3战神升天…...
bootstrap- X-editable 行内编辑
前面不要忘记引入editable {field: weigh, title: __(Weigh),editable: {type: text,url: "api/cat/editWeigh",validate: function (v) {if($.trim(v) ) return 值不能为空;if(!$.isNumeric(v)) return 值只能为数字;if(v<0 || v%1!0) return 值必需为正整数;}…...
【LabVIEW学习篇 - 12】:通知器
文章目录 通知器案例一案例二案例三(在不同VI中用同一个通知器) 通知器 同步技术:同步技术用来解决多个并行任务之间的同步或通信问题。 通知器比较适合一对多的操作,类似于广播,一点发出的通知消息, 其它…...
Oracle一对多(一主多备)的DG环境如何进行switchover切换?
本文主要分享Oracle一对多(一主多备)的DG环境的switchover切换,如何进行主从切换,切换后怎么恢复正常同步? 1、环境说明 本文的环境为一主两备,数据库版本为11.2.0.4,主要信息如下: 数据库IPdb_unique_n…...
DLSS Swapper深度解析:游戏性能优化实战指南
DLSS Swapper深度解析:游戏性能优化实战指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper作为一款开源游戏性能优化工具,专为解决PC玩家面临的DLSS版本管理难题而生。在3A游戏对…...
Nunchaku FLUX.1-dev效果展示:4步生成惊艳图片案例分享
Nunchaku FLUX.1-dev效果展示:4步生成惊艳图片案例分享 你是否曾经被AI生成图片的漫长等待时间所困扰?传统文生图模型往往需要20步以上的推理才能获得理想效果,而今天我要展示的Nunchaku FLUX.1-dev模型,仅需4步就能生成令人惊艳…...
如何为《以撒的结合:悔改》安装REPENTOGON扩展框架
如何为《以撒的结合:悔改》安装REPENTOGON扩展框架 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址: https://gitcode.com/gh_mirrors/re/REPENTOGON REPENTOGON是一款针对《以撒的结合:悔改》的扩展…...
JetLinks物联网平台TCP接入实战:从零配置到设备上线的完整流程
JetLinks物联网平台TCP接入实战:从零配置到设备上线的完整流程 在物联网应用开发中,设备接入是构建完整解决方案的第一步。JetLinks作为一款开源的物联网平台,提供了灵活的设备接入能力,其中TCP协议因其简单可靠的特点,…...
蓝桥杯菜鸟错题
遍历一个字符串内比较,j 应从 i 的后一位开始,保证不重复...
告别重复造轮子:用快马AI一键生成Unity通用数据管理模块,提升开发效率
今天想和大家分享一个提升Unity开发效率的实用技巧——如何快速构建一个通用的游戏数据管理模块。这个模块可以帮我们告别重复造轮子的痛苦,把更多精力放在游戏核心玩法的开发上。 为什么需要通用数据管理模块 在Unity开发中,我们经常需要处理各种游戏数…...
微信聊天记录永久保存终极指南:如何让珍贵对话永不消失
微信聊天记录永久保存终极指南:如何让珍贵对话永不消失 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…...
4步解放炉石玩家:开源脚本工具从配置到精通全指南
4步解放炉石玩家:开源脚本工具从配置到精通全指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 你是否也曾遇到这样的困境:每…...
Polars 2.0清洗稳定性生死线:当lazy.eval()遭遇OOM崩溃,这3个编译期优化参数必须重置!
第一章:Polars 2.0清洗稳定性生死线:当lazy.eval()遭遇OOM崩溃,这3个编译期优化参数必须重置!在 Polars 2.0 中,lazy.eval() 的执行模型已深度耦合 Rust 编译期查询优化器(QO),但默认…...
STEP3-VL-10B开源大模型部署:从HuggingFace下载到CSDN算力上线全过程
STEP3-VL-10B开源大模型部署:从HuggingFace下载到CSDN算力上线全过程 想体验一个能看懂图片、理解图表、甚至帮你分析复杂文档的AI助手吗?今天要介绍的STEP3-VL-10B,就是一个让你用普通显卡就能跑起来的“多面手”AI模型。 你可能听说过那些…...


