力扣 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]

提示:

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

题解:

之前大一小学期做过类似的题,依稀记得需要很多的判断是否拐弯和拐弯之后要怎么操作的数组变量,于是试着写了一下,其实不难,但是需要找到规律,在第一圈的右下左上的时候有点特殊,就是左之后就需要进行stepx--和stepy--了,stepx和stepy是指示在x轴和y轴的该次移动需要总共走过多少步,比如示例2的1->2->3->4的这次移动的stepy就是3,4->8->12这次移动的stepx就是2,在走到9之后,就需要更新stepx和stepy了,将其自减。而在其他圈的循环过程中,每两次转弯进行一次stepx--和stepy--即可。规律不难找,可以自己画画试一下。

判断循环结束的条件就使用现在遍历输出到list中的数据大小和数组大小相同作为结束变脸的条件。

击败了1.2%的用户,不过这坨代码终究是过了。

代码实现

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
//控制方向:右下左上
        int[][] derection = new int[][]{{0,1},{1,0},{0,-1},{-1,0}};
            //初始化y轴方向的行走距离
            int stepy = matrix[0].length-1; //3
            //初始化x轴方向的行走距离
            int stepx = matrix.length-1;// 2(实际在“左”之后就要更新--)
            int cur = 0;//记录当前的行走方向 0-右 1-下 2-左 3-上
            //设置一个记录现在走了多少步的count
            int count = 1;
            //记录现在遍历到的数组元素
            List<Integer> list = new ArrayList<>();
            list.add(matrix[0][0]);
            int startx =0;
            int starty = 0;
            int posx = 0;
            int posy  =0;
            int size = matrix.length*matrix[0].length;
            //记录圈数
            int r = 1;
            //记录现在拐了几次
            int c = 0;
            //System.out.println("数组的大小:"+size);
            while(count!=size){
                for(cur = 0;cur<=3;cur++){

                    //向右走
                    if(cur==0){
                        for (int i = 0; i < stepy; i++) {
                            posx+=derection[0][0];
                            posy+=derection[0][1];
                            list.add(matrix[posx][posy]);
                            ++count;
                            System.out.println(count);
                            if(count==size){
                                break;
                            }
                        }
                    }
                    //向下走
                    else if(cur == 1){
                        for (int i = 0; i < stepx; i++) {
                            posx+=derection[1][0];
                            posy+=derection[1][1];
                            list.add(matrix[posx][posy]);
                            ++count;
                            if(count==size){
                                break;
                            }
                        }
                    }
                    //向左走
                    else if(cur==2) {
                        for (int i = 0; i < stepy; i++) {
                            posx += derection[2][0];
                            posy += derection[2][1];
                            list.add(matrix[posx][posy]);
                            ++count;
                            if(count==size){
                                break;
                            }
                        }
                        //向左走完之后需要更新stepx和stepy
                        if(r==1) {
                            stepx -= 1;
                            stepy -= 1;
                            c=-1;
                            System.out.println("现在该位置完成第三次拐弯,并且将stepx/y-1,c置0 "+stepx+" "+stepy+" "+c);
                        }
                    }

                    //向上走
                    else{
                        for (int i = 0; i < stepx; i++) {
                            posx += derection[3][0];
                            posy += derection[3][1];
                            list.add(matrix[posx][posy]);
                            ++count;
                            if(count==size){
                                break;
                            }
                        }
                    }
                    c++;
                    if(c==2&&r!=1){
                        stepx--;
                        stepy--;
                        c=0;
                    }

                    if(count==size){
                        break;
                    }

                }
                System.out.println(r+"圈的stepx和stepy等于:"+stepx+" "+stepy);
                r++;
                // System.out.println("第一圈走完了,现在的count = "+count);
            }
            return list;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[SaaS] AI+数据,tiktok选品,找达人,看广告数据

TK观察专访丨前阿里“鲁班”创始人用AIGC赋能TikTok获千万融资用AI数据做TikTokhttps://mp.weixin.qq.com/s/xp5UM3ROo48DK4jS9UBMuQ主要还是爬虫做数据的。 商家做内容&#xff1a;1.找达人拍内容&#xff0c;2.商家自己做原生自制内容&#xff0c;3.广告内容。 短视频&…

MariaDB数据导入与导出操作演示

文章目录 整个数据库导出导入先删除库然后再导入 参考这里&#xff1a; MariaDB数据库导出导入. 整个数据库 该部分演示&#xff1a;导出数据库&#xff0c;然后重建数据库&#xff0c;并导入数据的整个过程。 导出 Win R &#xff0c;打开运行输入cmd并回车&#xff0c;然…

chatglm3-6b小试

原本想在VMware中装个unbutu&#xff0c;再搞chatglm&#xff0c;但经过调研发现业内都是采用双系统来搞chat的开发。于是只好用rufus制作了一个ubuntu22.04的系统盘&#xff0c;你需要准备8G&#xff0c;因为制作好镜像后是7个多G。安装这里就不说了。 1 ubuntu环境 安装好ubu…

python基础篇(2):字符串扩展知识点

1 字符串的三种定义方式 字符串在Python中有多种定义形式&#xff1a; &#xff08;1&#xff09;单引号定义法 name 博主帅绝上下五千年 print(name) print(type(name)) 效果如下&#xff1a; &#xff08;2&#xff09;双引号定义法 name "博主帅绝上下五千年&qu…

CUDA12.0 + cuDNN9.0.0安装

目录 1. 查看显卡支持的CUDA版本1.1 指令查看1.2 控制面板查看 2. 安装CUDA2.1 下载2.2 安装2.3 验证 3. 安装cuDNN3.1 下载3.2 安装3.2 验证 1. 查看显卡支持的CUDA版本 1.1 指令查看 打开cmd输入nvidia-smiDriver Version表示显卡驱动版本&#xff0c;CUDA Version表示支持…

【AndroidStudio旧版本BUG问题】完美解决运行报错问题Invalid keystore format

由于之前安装的版本导致AndroidStudio 运行报错&#xff1a;Invalid keystore format 在如下截图的路径中删了debug.keystore重新打开Android Studio运行一下就好了&#xff01;&#xff01;&#xff01; 下面介绍各个模块功能&#xff1a; adbkey 是 Android Debug Bridge (AD…

【数据库】SQL--DQL(初阶)

文章目录 DCL1. 基本介绍2. 语法2.1 基础查询2.2 条件查询2.3 聚合函数2.4 聚合查询2.5 分组查询2.6 排序查询2.7 分页查询2.8 综合案例练习2.9 执行顺序 3. DQL总结 DCL 更多数据库MySQL系统内容就在以下专栏&#xff1a; 专栏链接&#xff1a;数据库MySQL 1. 基本介绍 DQL英…

Linux下SpringBoot项目部署(centos系统)

一、首先找到自己的sql文件&#xff0c;没有就从数据库挪进来 二、在Maven下打包一下&#xff08;点击package&#xff09;&#xff0c;看到BUILD SUCCESS就是打包好了 三、将上面两个文件分别挪到 linux 中对应的文件&#xff0c;没有就创建一个&#xff08;我的是spring_blog…

【数据库初阶】SQL--DCL

文章目录 DCL1. 基本介绍2. 用户管理2.1 查询用户2.2 创建用户2.3 修改用户密码2.4 删除用户 3. 权限控制3.1 查询权限3.2 授予权限3.3 撤销权限 4. DCL总结 DCL 更多数据库MySQL系统内容就在以下专栏&#xff1a; 专栏链接&#xff1a;数据库MySQL 1. 基本介绍 DCL英文全称是…

Docker 部署 Redis Cluster 高性能高可用分片集群

文章目录 1、环境准备2、Cluster 集群讲解2.1、Cluster 介绍2.2、Cluster 和哨兵模式区别2.3、Cluster 如何分散存储数据 3、Cluster 搭建流程3.1、安装 Docker3.2、启动 Redis 容器3.3、创建 Cluster 集群 4、Cluster 集群测试4.1、读写操作4.2、故障转移 1、环境准备 准备6台…

计算机网络 ——数据链路层(广域网)

计算机网络 —— 广域网 什么是广域网PPP协议PPP协议的三个部分PPP协议的帧格式 HDLC协议HDLC的站HDLC的帧样式 PPP和HDLC的异同 我们今天来看广域网。 什么是广域网 广域网&#xff08;Wide Area Network&#xff0c;简称WAN&#xff09;是一种地理覆盖范围广泛的计算机网络…

php实现抖音小程序支付

开发者发起下单_小程序_抖音开放平台 第一步、抖音小程序发起支付 tt.pay_小程序_抖音开放平台 前端提交订单数据到后端接口&#xff0c;然后使用 tt.pay发起支付 请求参数 属性 类型 必填 说明 order_id string 是 担保交易服务端订单号 order_token string 是 …

css动画案例练习之会展开的魔方和交错的小块

这里写目录标题 一级目录二级目录三级目录 下面开始案例的练习&#xff0c;建议第一个动手操作好了再进行下一个一、交错的小块效果展示1.大致思路1.基本结构2.实现动态移动 2.最终版代码 二、会展开的魔方1.大致思路1.基本结构;2.静态魔方的构建3.让静态的魔方动起来 2.最终版…

Springboot高手之路01-AOP

文章目录 登录校验拦截器 基于拦截器实现登录校验功能全局异常处理器 登录校验 拦截器 拦截器是spring中提供的 所以第一步就是把拦截器交给spring管理 不管是过滤器还是拦截器都是需要配置路径 /** 拦截所有 拦截器放行直接是true 是否运行访问对应的web资源 拦截器实现Ha…

动态规划6:63. 不同路径 II

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题解&#xff1a;63. 不同…

通用漏洞-基于同源策略的cors与jsonp域名接管

脚本参考&#xff1a;https://www.cnblogs.com/haorancracker/articles/17699536.html) 1.cors&jsonp 在csrf的学习中&#xff0c;我们了解到解决第三方网站采取的发包操作&#xff0c;最简单的策略就是同源策略sof&#xff0c;即为同协议&#xff0c;同域名&#xff0c;…

C++设计模式-单例模式,反汇编

文章目录 25. 单例模式25.1. 饿汉式单例模式25.2. 懒汉式单例模式25.2.1. 解决方案125.2.2. 解决方案2 &#xff08;推荐写法&#xff09; 运行在VS2022&#xff0c;x86&#xff0c;Debug下。 25. 单例模式 单例即该类只能有一个实例。 应用&#xff1a;如在游戏开发中&#x…

VS2022,DLL1调用lib,lib调用DLL2

DLL1调用lib&#xff0c;lib调用DLL2 问题1&#xff1a;为什么在dll1中需要引入dll2的.lib文件 当你有一个工程&#xff08;dll1&#xff09;调用静态库&#xff08;lib&#xff09;&#xff0c;而静态库&#xff08;lib&#xff09;又调用另一个DLL&#xff08;dll2&#xf…

BPTT算法详解:深入探究循环神经网络(RNN)中的梯度计算【原理理解】

引言 在深度学习领域中&#xff0c;我们经常处理的是独立同分布&#xff08;i.i.d&#xff09;的数据&#xff0c;比如图像分类、文本生成等任务&#xff0c;其中每个样本之间相互独立。然而&#xff0c;在现实生活中&#xff0c;许多数据具有时序结构&#xff0c;例如语言模型…

基于EasyX的贪吃蛇小游戏 - C语言

游戏基本功能演示&#xff1a; 1.主菜单界面 2.自定难度界面 在这里可以自行设定游戏的难度&#xff0c;包括蛇的移动速度&#xff0c;初始节数&#xff0c;以及默认模式&#xff0c;参考线&#xff08;网格&#xff09;。这些设定的数据都会在右上角的游戏属性栏中实时显示。…