【LeetCode】54. 螺旋矩阵

题目链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意边界 和 方向变化

Python3

方法一: 计算每个元素 下一个元素的下标 ⟮ O ( m n ) 、 O ( m n ) ⟯ \lgroup O(mn)、O(mn) \rgroup O(mn)O(mn)⟯

模拟 螺旋矩阵 的路径
初始位置是矩阵的左上角,初始方向是向右,当路径超出界限或者进入之前访问过的位置时,顺时针旋转,进入下一个方向。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:rows, cols = len(matrix), len(matrix[0])visited = [[False] * cols for _ in range(rows)]ans = []directions = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 和 螺旋矩阵 的行列变化一致directionsIndex = 0  ## 位于 整个 圈的 哪一侧, 0 1 2 3 顶 右 下 左i, j = 0, 0for _ in range(rows * cols): # 每个元素读一遍ans.append(matrix[i][j])visited[i][j] = TruenextRow, nextCol = i + directions[directionsIndex][0],  j + directions[directionsIndex][1]     # 计算 下一个 读取元素的位置,这显然与 方向有关系##  判断是否 需要换方向, 每读一个元素 都要判断一次,显然冗余if nextRow < 0 or nextRow >= rows or nextCol < 0 or  nextCol >= cols or visited[nextRow][nextCol]: # 越界 或 读过 ——>  换方向 directionsIndex = (directionsIndex + 1) % 4 # 换方向i += directions[directionsIndex][0]j += directions[directionsIndex][1]return ans

方法二:按层模拟 ⟮ O ( m n ) 、 O ( 1 ) ⟯ \lgroup O(mn)、O(1) \rgroup O(mn)O(1)⟯

将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素。
在这里插入图片描述

class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:rows, cols =  len(matrix), len(matrix[0])ans = []left, right, top, bottom = 0, cols-1, 0, rows-1while left <= right and top <= bottom:for col in range(left, right + 1): # 注意 这四个参数是下标 , range为左闭右开ans.append(matrix[top][col])for row in range(top+1,bottom+1): # 注意交界处,读过了直接跳过ans.append(matrix[row][right])if left < right and top < bottom: # 还有列 和 行for col in range(right - 1, left, -1):ans.append(matrix[bottom][col])for row in range(bottom, top, -1):  # 注意不要重复,也不要遗漏ans.append(matrix[row][left])left, right, top, bottom = left + 1, right -1, top + 1, bottom -1return ans

C++

方法一: 计算每个元素 下一个元素的下标

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {int rows = matrix.size(), cols = matrix[0].size();vector<vector<bool>> visited(rows, vector<bool>(cols));int total = rows * cols;vector<int> ans(total);int i = 0, j = 0;int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int directionsIndex = 0;for (int loop = 0; loop < total; ++loop){ans[loop] = matrix[i][j];visited[i][j] = true;int nextRow = i + directions[directionsIndex][0], nextCol = j + directions[directionsIndex][1];if (nextRow < 0 || nextRow >= rows || nextCol < 0 || nextCol >= cols || visited[nextRow][nextCol])  {   //越界或 读过了——> 换方向directionsIndex = (directionsIndex + 1) % 4;}i += directions[directionsIndex][0];j += directions[directionsIndex][1];}return ans;}
};

方法二:按层模拟

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {int rows = matrix.size(), cols = matrix[0].size();vector<int> ans;int left = 0, right = cols - 1, top = 0, bottom = rows - 1;while (left <= right  && top <= bottom){for (int col = left; col <= right; ++col){ans.emplace_back(matrix[top][col]);}for (int row = top + 1; row <= bottom; ++row){ans.emplace_back(matrix[row][right]);}if (left < right && top < bottom){for (int col = right - 1; col > left; --col){ans.emplace_back(matrix[bottom][col]);}for (int row = bottom; row > top; --row){ans.emplace_back(matrix[row][left]);}}left ++;  right --; top ++; bottom --;}return ans;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC核心技术剖析】基于大规模弱监督的鲁棒语音识别【附源码】

论文研究了语音处理系统的能力&#xff0c;该系统只是为了预测互联网上的大量音频成绩单而训练的。当扩展到 680,000 小时的多语言和多任务监督时&#xff0c;生成的模型可以很好地推广到标准基准&#xff0c;并且通常与先前的完全监督结果竞争&#xff0c;但在零镜头传输设置中…

大势山维 | 全盘自主可控的实景三维中国建设解决方案

实景三维中国建设是面向新时期测绘地理信息事业服务于社会经济建设和生态文明建设的新定位、新需求。多年来&#xff0c;大势智慧与山维科技深耕数字化建设&#xff0c;以技术研发为立身之本&#xff0c;逐步成长为空间地理信息建设领域的领跑企业。 大势智慧围绕三维重建国产…

ICML2021 | RSD: 一种基于几何距离的可迁移回归表征学习方法

目录 引言动机分析主角&#xff08;Principal Angle&#xff09;表征子空间距离正交基错配惩罚可迁移表征学习实验数据集介绍 实验结果总结与展望 论文链接 相关代码已经开源 引言 深度学习的成功依赖大规模的标记数据&#xff0c;然而人工标注数据的代价巨大。域自适应&…

Mybatis-plus连接postgrel数据库主键自增问题

首先pg中没有直接设置主键自增这一说法&#xff0c;一般只能新建一个序列&#xff0c;可以使用Navicat创建 在mp的配置类中加入序列的配置&#xff1a; Bean public IKeyGenerator keyGenerator() {return new H2KeyGenerator(); }然后实体类的主键策略只能是INPUT&#xff0…

SQLServe联合主键、联合索引、唯一索引,聚集索引,和非聚集索引、主键、唯一约束和外键约束、索引运算总结

联合主键 SQL server 中给表增加联合主键的两种方法 第一种方法&#xff0c;新建表时增加联合主键&#xff1a; create table t_students(id int not null,name varchar(10) not null Primary Key (id, name),age int,dept_id int )注&#xff1a;联合主键的列需要限制非空约…

React中的key有什么作用

一、是什么 首先&#xff0c;先给出react组件中进行列表渲染的一个示例&#xff1a; const data [{ id: 0, name: abc },{ id: 1, name: def },{ id: 2, name: ghi },{ id: 3, name: jkl } ];const ListItem (props) > {return <li>{props.name}</li>; };co…

解决Unity打包时,Android SDK 报错问题

报错内容应该包括类似如下信息&#xff1a; CommandInvokationFailure: Failed to update Android SDK package list. java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocationsProvider has been compiled by a more recent version of the Java Runtim…

Vue 异步更新 -- $nextTick

Vue 异步更新 – $nextTick **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day04\准备代码\16-$nextTick vue --version vue crea…

亿赛通电子文档安全管理系统 Update.jsp SQL注入

目录 0x01 漏洞介绍 0x02 影响产品 0x03 语法特征 0x04 漏洞复现页面 0x05 漏洞修复建议 0x01 漏洞介绍 亿赛通电子文档安全管理系统是国内最早基于文件过滤驱动技术的文档加解密产品之一&#xff0c;保护范围涵盖终端电脑&#xff08;Windows、Mac、Linux系统平台&#…

cAdvisor监控Docker容器做性能测试

cAdvisor监控Docker容器做性能测试 缘起 当前有个服务做技术选型&#xff0c;服务要求比较高的性能&#xff0c;要做性能测试。部署的环境是容器话部署&#xff0c;但申请新的容器流程较长&#xff0c;于是我打算在流程走完之前简单评估下性能&#xff0c;来确定技术选型是否…

深度学习YOLOv4环境配置

软件安装 1、什么是CUDA CUDA(ComputeUnified Device Architecture)&#xff0c;是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU能够解决复杂的计算问题。 CUDA下载地址为CUDA Toolkit Archive | NVIDIA Developer 版…

【Django 02】数据表构建、数据迁移与管理

1. Django 构建数据表创建与数据迁移 1.1 数据表创建 1.1.1 模块功能 如前所述&#xff0c;models.py文件主要用一个 Python 类来描述数据表。运用这个类,可以通过简单的 Python 代码来创建、检索、更新、删除 数据库中的记录而无需写一条又一条的SQL语句。今天的例子就是在…

微软Azure OpenAI支持数据微调啦!可打造专属ChatGPT

10月17日&#xff0c;微软在官网宣布&#xff0c;现在可以在Azure OpenAI公共预览版中对GPT-3.5-Turbo、Babbage-002 和Davinci-002模型进行数据微调。 使得开发人员通过自己的数据集&#xff0c;便能打造独一无二的ChatGPT。例如&#xff0c;通过海量医疗数据进行微调&#x…

RSTP详解:对比STP,到底改进了什么?

一、RSTP概述 IEEE 802.1W中定义的RSTP可以视为STP的改进版本&#xff0c;RSTP在许多方面对STP进行了优化&#xff0c;它的收敛速度更快&#xff0c;而且能够兼容STP。 二、RSTP对STP的改进 改进点1&#xff1a;端口角色 、 改进点2&#xff1a;端口状态 RSTP的状态规范缩…

行业追踪,2023-10-20

自动复盘 2023-10-20 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

记一次EDU证书站

如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏一键三连支持以下哦&#xff01; 想要一起交流学习的小伙伴可以加zkaq222&#xff08;备注CSDN&#xff0c;不备注通不过哦&#xff09;进入学习&#xff0c;共同学习进步 目录 目录 1.前言&#xff1a; 2.信息搜集 3.漏…

C++11——多线程

目录 一.thread类的简单介绍 二.线程函数参数 三.原子性操作库(atomic) 四.lock_guard与unique_lock 1.lock_guard 2.unique_lock 五.条件变量 一.thread类的简单介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linu…

【Qt-19】按Q退出应用程序

如何将Qt窗口应用程序改成控制台程序呢&#xff1f; 下面进入正文&#xff0c;如何控制控制台程序退出呢&#xff1f; 这里采用线程方式&#xff0c;通过单独线程监视用户输入来执行是否退出程序。 监视线程头文件thread.h #include <QThread> #include "TDRServe…

API网关与社保模块

API网关与社保模块 理解zuul网关的作用完成zuul网关的搭建 实现社保模块的代码开发 zuul网关 在学习完前面的知识后&#xff0c;微服务架构已经初具雏形。但还有一些问题&#xff1a;不同的微服务一般会有不同的网 络地址&#xff0c;客户端在访问这些微服务时必须记住几十甚至…

API 排行榜,盘点用的最多的 API 协议!

每个人都用过 HTTP 协议。在网页端&#xff0c;在 App 端&#xff0c;大部分的数据交换都基于 HTTP 协议&#xff0c;但你也许会听过其他的一些协议。 从 《2023 全球 API 状况报告》 里的数据&#xff0c;我们能看到全球的开发者使用最多的 API 协议&#xff1a; 这些协议有什…