力扣 54.螺旋矩阵

news2025/1/16 19:58:57

题目描述

给你一个 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;
    }
}

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

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

相关文章

【宠粉赠书】大模型时代的网络安全:安恒“网安三剑客”实战指南

不知不觉中&#xff0c;小智的粉丝已经突破一万。为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套网络安全界的三宝书——安恒"网安三剑客"。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 随着人工智能&#xff08;AI&#xff09;和大模型…

基于协同过滤算法的东北特产销售系统的设计

基于协同过滤算法的东北特产销售系统的设计 管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;新闻信息管理&#xff0c;商品管理 农户账户功能包括&#xff1a;系统首页&#xf…

【数据库】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英…

WPF -> MVVM

1.1安装MVV MLight 打开 Visual Studio 2022。 在顶部菜单栏中选择“工具” -> “NuGet 包管理器” -> “程序包管理器控制台”。 在控制台中输入以下命令&#xff0c;并按回车键运行&#xff1a; Install-Package MvvmLightLibsStd104.等待安装完成后&#xff0c;你就…

汇编:调用Win32 API

在32位汇编程序中使用 Win32 API 是很常见的&#xff0c;特别是在开发 Windows 应用程序时调用的频率很高&#xff0c;Win32 API 提供了访问 Windows 操作系统功能的接口&#xff0c;包括窗口、消息处理、文件操作、网络通信等等。以下是使用 Win32 API 的一般步骤&#xff1a;…

Vue3项目练习详细步骤(第二部分:主页面搭建)

主页面搭建 页面主体结构 路由 子路由 主页面搭建 页面主体结构 在vuews目录下新建Layout.vue文件 主页面内容主体代码 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchButton,CaretBottom } from element-plus/icons-vue imp…

在线建站流程分析

建站流程是指通过互联网创建一个个人或企业网站的过程。随着互联网的发展&#xff0c;越来越多的人和机构开始意识到网络的重要性&#xff0c;建站成为一种常见的行为。在线建站的流程一般包括以下几个步骤。 首先&#xff0c;选择一个合适的建站平台。目前&#xff0c;有很多在…

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

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

C++ primer例子1实现

问题 代码 Sales_item.h #include<iostream> #include<string> class Sales_item {public:Sales_item(){};Sales_item(std::string insid, int num, double price);friend std::istream& operator>>(std::istream& is, Sales_item& item);frie…

SpringBoot: 读取项目的Git版本号

在开发项目的时候&#xff0c;我们经常会想要拿到线上运行的程序版本&#xff0c;以确定程序是否正确发布。Spring Boot提供了这样的能力支持。这个能力的核心组件是3个: Maven插件git-commit-id-maven-plugin&#xff0c;用于生成.properties文件&#xff0c;里边包含git的各…

登录通用解决方案 —— 第三方登录处理

目录 01: 前言 02: 第三方平台登录解决方案流程大解析 03: QQ 开放平台流程大解析 04: QQ 登录对接流程&#xff1a;获取 QQ 用户信息 05: QQ 登录对接流程&#xff1a;跨页面信息传输 06: QQ 登录对接流程&#xff1a;认证是否已注册&#xff0c;完成 QQ …

文件同步软件免费下载

在数字化时代&#xff0c;数据已成为我们生活和工作中不可或缺的一部分。无论是个人用户还是企业团队&#xff0c;都需要一种高效、便捷的方式来管理和同步数据。文件同步软件应运而生&#xff0c;它能够帮助我们轻松实现数据的实时更新和共享。本文将为大家介绍几款优秀的文件…

下载ubuntu22.04

建议使用&#xff1a;清华源镜像 官网下载比较慢Ubuntu 22.04.4 LTS (Jammy Jellyfish) 打开清华源向下翻 然后找到22.04 下载完成&#xff1a;

计算机网络 —— 数据链路层(无线局域网)

计算机网络 —— 数据链路层&#xff08;无线局域网&#xff09; 什么是无线局域网IEEE 802.11主要标准及其特点&#xff1a; 802.11的MAC帧样式 我们来看看无线局域网&#xff1a; 什么是无线局域网 无线局域网&#xff08;Wireless Local Area Network&#xff0c;简称WLAN…

学生成绩管理系统(大一大作业)

功能 实现添加&#xff0c;排序&#xff0c;修改&#xff0c;保存等功能 库函数 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<string.h> 头文件 #define functioncreate(major) void major##compare(mana mn){\int i,j,s…

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

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

mkfs.ubifs -c 计算工具

mkfs.ubifs -c 输入的logical erase block count,是指除掉ubi文件系统自身管理和坏块处理后的逻辑可擦除最大块数。 参考信息如下&#xff1a; logical erase block count 计算工具&#xff0c;实现代码如下&#xff1a; #!/usr/bin/python # -*- coding: UTF-8 -*-import os…

【AI大模型】基于Langchain和Openai借口实现英文翻译中文应用

&#x1f680; 作者 &#xff1a;“大数据小禅” &#x1f680; 文章简介 &#xff1a;本专栏后续将持续更新大模型相关文章&#xff0c;从开发到微调到应用&#xff0c;需要下载好的模型包可私。 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 目…

智慧城市的规划与实施:科技引领城市运行效率新飞跃

随着信息技术的飞速发展&#xff0c;智慧城市的构想正逐步成为现实。作为地理信息与遥感领域的研究者&#xff0c;我深知在这一转型过程中&#xff0c;技术的创新与应用是提升城市运行效率的关键。本文旨在探讨如何利用地理信息系统&#xff08;GIS&#xff09;、遥感技术、大数…

【深度学习入门篇一】阿里云服务器(不需要配环境直接上手跟学代码)

前言 博主刚刚开始学深度学习&#xff0c;配环境配的心力交瘁&#xff0c;一塌糊涂&#xff0c;不想配环境的刚入门的同伴们可以直接选择阿里云服务器 阿里云天池实验室&#xff0c;在入门阶段跑个小项目完全没有问题&#xff0c;不要自己傻傻的在那配环境配了半天还不匹配&a…