从零学算法54

news2024/11/13 9:55:43

54.给你一个 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]

  • 我的原始人解法:根据题意设置一个包含四个方向的数组,起点为 (0,0),当在某个方向移动到超出边界或移动到已到达过的点就转向,如果转向后下一轮移动还是越界或处于已到达点,那就说明结束了螺旋遍历。

  •   int m,n;
      public List<Integer> spiralOrder(int[][] matrix) {
          List<Integer> ans = new ArrayList<>();
          m = matrix.length;
          if(m==0)return ans; 
          n = matrix[0].length;
          // 右,下,左,上
          int[][] pos = new int[][]{{0,1},{1,0},{0,-1},{-1,0}};
          // 是否到达过某个点
          int[][] visited = new int[m][n];
          // 当前方向
          int pi = 0;
          // 当前位于坐标
          int i=0,j=0;
          while(true){
          	// 越界或处于已到达点,结束遍历
              if(!isValid(i,j) || visited[i][j]==1)break;
              // 记录当前点
              ans.add(matrix[i][j]);
              visited[i][j]=1;
              int px = pos[pi][0];
              int py = pos[pi][1];
              // 如果按照当前方向移动不可行就转向
              if(!isValid(i+px,j+py) || visited[i+px][j+py]==1){
                  pi=(pi+1)%4;
                  px = pos[pi][0];
                  py = pos[pi][1];
              }
              // 更新坐标
              i+=px;
              j+=py;
              
          }
          return ans;
      }
      public boolean isValid(int i,int j){
          return i>=0 && i<m && j>=0 && j<n;
      }
    
  • 他人题解:由于螺旋打印其实就是四个方向上的不断向内收缩,所以我们可以用四个变量 t(top),b(bottom),l(left),r(right) 来表示上下左右的边界,模拟一圈打印,你会发现,最开始顶部的从左到右,就是固定 t,从 l 到 r 遍历,第一行遍历完就需要收缩顶部,即 t+1;然后是最右侧的从上到下,其实就是固定 r,从 t 到 b 遍历,遍历完最右侧,右侧往里收缩,即 r - 1…,只要 l > r 或 t > b 就表示已经收缩到极点开始反向扩张了,就退出遍历。
    请添加图片描述

  •   public List<Integer> spiralOrder(int[][] matrix) {
          List<Integer> ans = new ArrayList<>();
          int m = matrix.length;
          if(m==0)return ans; 
          int n = matrix[0].length;
          int t = 0, b = m - 1, l = 0, r = n - 1;
          while(true){
              for(int i=l;i<=r;i++)ans.add(matrix[t][i]);
              if(++t>b)break;
              for(int i=t;i<=b;i++)ans.add(matrix[i][r]);
              if(--r<l)break;
              for(int i=r;i>=l;i--)ans.add(matrix[b][i]);
              if(--b<t)break;
              for(int i=b;i>=t;i--)ans.add(matrix[i][l]);
              if(++l>r)break;
          }
          return ans;
      }
    

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

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

相关文章

计算机竞赛python区块链实现 - proof of work工作量证明共识算法

文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…

计算机网络自顶向下实例

一名学生将便携机与学校的以太网交换机相连&#xff0c;下载一个Web页面 ①准备&#xff1a;DHCP、UDP、IP和以太网 学生启动便携机&#xff0c;然后用一根以太网电缆连接到学校的以太网交换机&#xff0c;交换机与学校的路由器相连。学校的路由器与一台ISP连接&#xff0c;以…

Java架构师高可用架构设计

目录 1 导学2 高可用到底是什么3 高可用架构的原则4 集群保障高可用5 限流保障高可用6 熔断降级保障高可用7 隔离保障高可用8 回滚保障高可用9 重试机制保障高可用10 备用系统11 辅助手段12 总结1 导学 在本章学习里面我们会先去学习耳熟能详的高可用到底是什么,然后呢去学习高…

src实战-两处nacos未授权访问

目录 一、hunter上搜索web.title”nacos”&#xff0c;查找中国境内的资产&#xff0c;定位到两个地址。 二、访问一下8086端口&#xff0c;界面很明显是nacos&#xff0c;直接抓包&#xff0c;创建用户。 三、登录网站&#xff0c;里面看到配置管理。 四、查看下redis.yml…

OSPF不同网络类型建立邻居实验

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

欧科云链研究院:仰传统机构之“鼻息”,RWA的关键不在于Web3技术

前言 RWA与资产代币化正成为区块链与Web3技术在全球范围最受关注的用例之一。香港、新加坡等众多国家及地区都在积极推进相关实践及布局。欧科云链研究院从今年4月开始密切关注RWA发展&#xff0c;并在《》一文中率先提出“RWA将成为香港Web3最值得期待的应用方向”。 伴随着R…

2023版IDEA的下载、安装、配置、快捷键、模板、插件与使用

&#x1f389; 为什么会有这篇教程&#xff1a;熟悉 IDEA 并能灵活熟练使用 IDEA 能极大提高您的开发效率&#xff01;&#xff01;&#xff01; &#x1f4cd; 本文教程基于当前 idea 的最新版本 2023.2.2。 &#x1f4cd; 本文教程的所有操作图片均是实操测试截图或 gif 动态…

LSTM的预测算法 - 股票预测 天气预测 房价预测 计算机竞赛

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

中老年网红,下一个流量红海?丨小红书银发博主内容分析

有“中老年女性收割机”之称的短视频网红主播“秀才”&#xff0c;账号9月2日被封的消息一发出&#xff0c;便刷屏了各大社交平台的热榜。如果说“秀才”是行走的“中老年妇女收割机”&#xff0c;那么网红“一笑倾城”&#xff0c;则被称为“中老年男人心目中的易梦玲”。数据…

矩阵病态问题

病态&#xff08;ill-conditioned)矩阵病态&#xff08;ill-posed)方程 病态矩阵 矩阵的frobenius范数&#xff1a; 对每一个元素平方&#xff0c;求和再开平方 矩阵的条件数&#xff1a;矩阵的frobenius范数与该矩阵的逆的frobenius范数的乘积 对于同阶矩阵&#xff0c;矩阵的…

LayoutInflater.inflate的用法

LinearLayout ll findViewById(R.id.ll); LayoutInflater layoutInflater LayoutInflater.from(this); layoutInflater.inflate(R.layout.aa,ll); 把第一个参数的xml内容加到第二个参数viewgroup中。 如果第二个参数为null&#xff0c;就直接view xxxxxx.inflate();

Unity设计模式——模板模式

模板方法模式&#xff0c;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得 子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 Abstract Class 是抽象类&#xff0c;其实也就是一抽象模板&#xff0c;定义并实现了一个模版方法。这…

面试过不了?超全,高频接口测试面试题+答案,预判你的预判...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题1&#xff…

Postgresql源码(115)LLVM JIT运行逻辑分析(上)

1 JIT入口开关 总入口&#xff1a;jit_enabled打开 且 生成计划成本超过jit_above_cost启动JIT。 计划成本超过jit_optimize_above_cost&#xff0c;执行PGJIT_OPT3使用O3对IR进行优化。计划成本超过jit_inline_above_cost&#xff0c;执行PGJIT_INLINE。jit_expressions开关如…

MES生产管理系统 MES系统

MES生产管理系统 MES系统 MES包括ERP及生产管理&#xff0c;主要有销售&#xff0c;采购&#xff0c;仓库&#xff0c;财务&#xff0c;设备管理&#xff0c;生产&#xff0c;报工&#xff0c;质量管理模块。适用于各行各业的生产情况。 1.销售模块&#xff08;销售订单&…

证件照如何自己换底色?快速证件照换底色方法

提交证件照信息的时候&#xff0c;通常需要满足一些规定&#xff0c;比如某一种背景底色&#xff0c;当不符合要求的时候&#xff0c;我们该怎么更换证件照底色呢&#xff1f;其实可以使用证件照换背景&#xff08;证件照换背景 证件照换颜色 照片换背景-压缩图&#xff09;工具…

Android Studio git 取消本地 commit(未Push)

操作比较简单 1.选中项目然后依次选择&#xff1a;Git->Repository->Reset HEAD 2.然后再to Commit中输入HEAD^&#xff0c;表示退回到上一个版本。

c++中什么时候用double?

c中什么时候用double? 在C中&#xff0c;通常使用double数据类型来表示浮点数&#xff0c;特别是当需要更高的精度时。以下是一些情况下可以考虑使用double的示例&#xff1a; 1. **需要高精度的计算**&#xff1a;当您需要进行精确的浮点数计算时&#xff0c;double通常比flo…

CANoe从零学习第2期课程,全新上线!

课程内容的视频解读 CANoe编程宝典课程内容介绍 课程内容的视频解读&#xff0c;复制链接&#xff0c;打开抖音查看 &#xff1a;CANoe编程宝典课程内容介绍 - 抖音

2023年中国划船机产量、销量及市场规模分析[图]

划船机是一种健身器材&#xff0c;它模拟了划船的运动&#xff0c;可以锻炼身体的肌肉力量和协调性。划船机通常由座椅、把手、脚踏板和传动装置组成&#xff0c;使用者可以通过拉动把手来模拟划船的动作&#xff0c;从而达到锻炼身体的目的。 划船机产业链 资料来源&#xff…