leetcode第54题

简介: 在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。


image.png

从第一个位置开始,螺旋状遍历二维矩阵

image.png

解法一

可以理解成贪吃蛇,从第一个位置开始沿着边界走,遇到边界就转换方向接着走,直到走完所有位置。

/** direction 0 代表向右, 1 代表向下, 2 代表向左, 3 代表向上*/publicList<Integer>spiralOrder(int[][] matrix) {
List<Integer>ans=newArrayList<>();
if(matrix.length==0){
returnans;
    }
intstart_x=0, 
start_y=0,
direction=0, 
top_border=-1,  //上边界right_border=matrix[0].length,  //右边界bottom_border=matrix.length, //下边界left_border=-1; //左边界while(true){
//全部遍历完结束if (ans.size() ==matrix.length*matrix[0].length) {
returnans;
        }
//注意 y 方向写在前边,x 方向写在后边ans.add(matrix[start_y][start_x]);
switch (direction) {
//当前向右case0:
//继续向右是否到达边界//到达边界就改变方向,并且更新上边界if (start_x+1==right_border) {
direction=1;
start_y+=1;
top_border+=1;
                } else {
start_x+=1;
                }
break;
//当前向下case1:
//继续向下是否到达边界//到达边界就改变方向,并且更新右边界if (start_y+1==bottom_border) {
direction=2;
start_x-=1;
right_border-=1;
                } else {
start_y+=1;
                }
break;
case2:
if (start_x-1==left_border) {
direction=3;
start_y-=1;
bottom_border-=1;
                } else {
start_x-=1;
                }
break;
case3:
if (start_y-1==top_border) {
direction=0;
start_x+=1;
left_border+=1;
                } else {
start_y-=1;
                }
break;
        }
    }
}

时间复杂度:O(m * n),m 和 n 是数组的长宽。

空间复杂度:O(1)。

在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。

相关文章
|
Ubuntu Linux Docker
|
1月前
|
云安全 人工智能 自然语言处理
产业升级丨负责任的 AI,从 AI 治理和安全能力构建开始
未来,在 AI 与人类和谐共生的世界里,AI 不仅是强大的工具,更是负责任的伙伴。
|
Python
Python读取DataFarme中Nan值时显示“KeyError: 1”
Python读取DataFarme中Nan值时显示“KeyError: 1”
841 0
Python读取DataFarme中Nan值时显示“KeyError: 1”
|
8月前
|
机器学习/深度学习 自然语言处理 搜索推荐
《让机器人读懂你的心:情感分析技术融合奥秘》
情感分析技术正赋予机器人理解人类情绪的能力,使其从冰冷的工具转变为贴心伙伴。通过语音、面部表情和文本等多模态信息,机器人可精准识别情绪并做出相应反应。然而,多模态数据融合、个性化情感理解及自然情感表达仍是技术难点。一旦突破,机器人将在医疗、教育和养老等领域大放异彩,成为患者助手、个性化教师和老人陪伴者,开启人机交互新纪元。这不仅是一次技术飞跃,更是机器人迈向情感世界的深刻变革。
582 0
|
JavaScript 前端开发 持续交付
【专栏】Vue.js和Node.js如何结合构建现代Web应用
【4月更文挑战第27天】本文探讨了Vue.js和Node.js如何结合构建现代Web应用。Vue.js作为轻量级前端框架,以其简洁易懂、组件化开发、双向数据绑定和虚拟DOM等特点受到青睐;而Node.js是高性能后端平台,具备事件驱动、非阻塞I/O、丰富生态系统和跨平台优势。两者结合实现前后端分离,高效通信,并支持热更新、持续集成、跨平台和多端适配,为开发高性能、易维护的Web应用提供强有力的支持。
545 2
|
3月前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
297 0
|
自然语言处理 JavaScript 网络协议
简单使用vitepress快速搭建一个文档网站
VitePress 是一个静态站点生成器 (SSG),类似的项目有docsify、VuePress、hexo。用 Markdown 编写的内容生成可以轻松部署到任何地方的静态 HTML 页。
478 9
|
应用服务中间件 PHP nginx
Mac安装Nginx
Mac安装Nginx
213 2
Mac安装Nginx
|
Ubuntu Linux Shell
在Linux中,如何使用shell脚本判断某个服务是否正在运行?
在Linux中,如何使用shell脚本判断某个服务是否正在运行?
|
移动开发 监控 小程序
分享75个商务商城PHP源码,总有一款适合你
分享75个商务商城PHP源码,总有一款适合你
1482 1