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

leetcode面试经典150题——35 螺旋矩阵

题目: 螺旋矩阵

描述
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例:
在这里插入图片描述
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
leetcode链接

方法一:模拟
我们顺时针螺旋输出矩阵的顺序可以看成为输出一个个子矩阵的边框,即每个矩阵的第一行,最后一列,最后一行,第一列,然后去除掉重复输出的四个对角,再对下一个子矩阵循环此输出,考虑特殊情况当子矩阵为一行或者一列时候,直接输出一行或者一列。

如下图所示,螺旋输出该矩阵
在这里插入图片描述
第一次依次输出最外层矩阵四个边框,然后去除重复元素(即4个角多输出了一次)
在这里插入图片描述
再输出子矩阵的四个边框,重复操作,直到没有子矩阵
在这里插入图片描述
在这里插入图片描述

时间复杂度:o(mn) 矩阵每个元素遍历一次,一共m*n个元素
空间复杂度:o(1)

vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;int m  = matrix.size(),n = matrix[0].size();int r = 0,l = 0;while(m>0&&n>0){for(int j=l;j<l+n;j++){//输出第一行ans.push_back(matrix[r][j]);}if(m==1)break;ans.pop_back();//取出重复存储的元素for(int i=r;i<r+m;i++){//输出最后一列ans.push_back(matrix[i][l+n-1]);}if(n==1)break;ans.pop_back();//取出重复存储的元素for(int j=l+n-1;j>=l;j--){//输出最后一行ans.push_back(matrix[r+m-1][j]);}ans.pop_back();//取出重复存储的元素for(int i=r+m-1;i>=r;i--){//输出第一列ans.push_back(matrix[i][l]);}ans.pop_back();//取出重复存储的元素m-=2,n-=2;//更新下一个子矩阵的行列数r++,l++;//更新下一个子矩阵的第一个元素的行列下标}return ans;}

相关文章:

  • css 输入框动态特效
  • X86汇编语言:从实模式到保护模式--命令篇
  • docker基本管理和相关概念
  • Docker网络原理及Cgroup硬件资源占用控制
  • blender 粒子系统 roughness 属性
  • 构建Servlet项目流程
  • IDEA中.java .class .jar的含义与联系
  • iptables(二)
  • Vue.delete
  • 面向对象中的单例模式
  • 智能优化算法应用:基于蚁狮算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 一文说清google最新大模型Gemini
  • 常见位运算的公式大全(建议收藏,以防走丢)
  • 人工智能技能要求
  • 基于Java个人作品管理系统
  • JS 中的深拷贝与浅拷贝
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • JavaScript设计模式之工厂模式
  • Java-详解HashMap
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Python进阶细节
  • select2 取值 遍历 设置默认值
  • 笨办法学C 练习34:动态数组
  • 编写高质量JavaScript代码之并发
  • 动态魔术使用DBMS_SQL
  • 给新手的新浪微博 SDK 集成教程【一】
  • 构造函数(constructor)与原型链(prototype)关系
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 深度学习在携程攻略社区的应用
  • 我的zsh配置, 2019最新方案
  • 项目管理碎碎念系列之一:干系人管理
  • 一些关于Rust在2019年的思考
  • 赢得Docker挑战最佳实践
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 白色的风信子
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 积累各种好的链接
  • 如何用纯 CSS 创作一个货车 loader
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (SpringBoot)第二章:Spring创建和使用
  • (接口封装)
  • (十八)三元表达式和列表解析
  • (四)Controller接口控制器详解(三)
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)EOS中账户、钱包和密钥的关系
  • *** 2003
  • .NET 5种线程安全集合
  • .net 7 上传文件踩坑