leetcode 54. 螺旋矩阵

news/2024/7/20 21:52:50 标签: leetcode, 矩阵, 深度优先

题目链接:leetcode 54

1.题目

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

2.示例

1)示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

2)示例 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]

3)提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

3. 分析

根据分析,可以发现顺时针螺旋顺序分别是向右,向下,向左,向上再向右,可以记录元素是否被访问来确定以上四个方向的边界

4.代码

class Solution {
public:
    vector<int> ans;
    bool vis[15][15];
    bool check(int x,int y,vector<vector<int>>& matrix){
        int n=matrix.size(),m=matrix[0].size();
        if(x<0||x>=n) return false;
        if(y<0||y>=m) return false;
        if(vis[x][y]==true) return false;
        return true;
    }
    void get_dfs(int x,int y,vector<vector<int>>& matrix,int op) {
        vis[x][y]=true;
        ans.push_back(matrix[x][y]);
        int n=matrix.size(),m=matrix[0].size();
        if(op==0){
            if(check(x,y+1,matrix)) get_dfs(x,y+1,matrix,op);
            else {
                if(check(x+1,y,matrix)) get_dfs(x+1,y,matrix,1);
            }
            return;
        }
        if(op==1){
            if(check(x+1,y,matrix))get_dfs(x+1,y,matrix,op);
            else {
                if(check(x,y-1,matrix)) get_dfs(x,y-1,matrix,2);
            }
            return;
        }
        if(op==2){
            if(check(x,y-1,matrix)) get_dfs(x,y-1,matrix,op);
            else {
                if(check(x-1,y,matrix)) get_dfs(x-1,y,matrix,3);
            }
            return;
        }
        if(check(x-1,y,matrix)) get_dfs(x-1,y,matrix,op);
        else {
            if(check(x,y+1,matrix)) get_dfs(x,y+1,matrix,0);
        }
    }
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        memset(vis,false,sizeof(vis));
        get_dfs(0,0,matrix,0);
        return ans;
    }
};

http://www.niftyadmin.cn/n/317760.html

相关文章

二、软件工程——Modeling

1.Undestanding Requirements System Engineering&#xff08;系统工程&#xff09; &#xff01;&#xff01;&#xff01;Requirements Engieering(需求建模&#xff09; 1.Inception&#xff08;开始&#xff09;&#xff1a;&#xff08;确认利益相关者&#xff09; 2.…

redis从零开始(1)----五种基本类型的使用

认识redis NoSQL Nosql not only sql&#xff0c;泛指非关系型数据库&#xff0c;与之相对的是RDBMS(Relational Database Management System)&#xff0c;即关系型数据库 关系型数据库&#xff1a;列行&#xff0c;同一个表下数据的结构是一样的。 非关系型数据库&#xff…

测试用例、测试流程模型、测试方法详解 超详细分解

1. 测试用例 1.1 测试用例前提 什么是测试用例&#xff1f; 一组由前提条件、测试输入、执行条件以及预期结果等组成&#xff0c;以完成对某个特定需求或者目标测试的数据&#xff0c;体现测试方案、方法、技术和策略的文档。 为什么编写测试用例 &#xff08;1&#xff0…

VOC标签格式转yolo格式并划分训练集和测试集

目录 一、了解VOC数据格式 1、Annotations目录 2. JPEGImages目录 二、YOLO格式 三、VOC标签格式转yolo格式并划分训练集和测试集 一、了解VOC数据格式 Pascal VOC数据集下载地址&#xff1a;The PASCAL Visual Object Classes Homepage 介绍一下VOC 数据集下载后的目录结构…

SOLIDWORKS钣金折弯参数设置技巧

折弯系数早期是没有计算方法的&#xff0c;工厂都是根据实际经验确定下来的经验公式。 记录下来一个经验数据表或简单的经验公式。后来才出现的中性层概念&#xff0c;即既不伸长也不压缩的那一层为中性层。可以用来计算展开长度。SOLIDWORKS钣金折弯参数也是整合了所有的计算…

八年软件测试感悟--写给还在迷茫的你

不知不觉已经从事软件测试八年了&#xff0c;2015毕业到进入外包公司外包给微软做软件测试&#xff0c; 到现在加入著名的外企。八年的时间过得真快。 长期的测试工作也让我对软件测试有了比较深入的认识。但是我至今还是一个底层的测试人员&#xff0c;我的看法都比较狭隘&…

Redis中的缓存穿透、雪崩、击穿

概述&#xff1a; 缓存穿透&#xff1a;大量请求根本不存在的key&#xff0c; 应用服务器压力变大缓存雪崩&#xff1a;redis中大量key集体过期&#xff0c;数据库压力变大&#xff0c;服务器崩溃缓存击穿&#xff1a;redis中一个热点key过期&#xff08;大量用户访问该热点ke…

SE、CBAM、ECA注意力机制(网络结构详解+详细注释代码+核心思想讲解+注意力机制优化神经网络方法)——pytorch实现

这期博客我们来学习一下神秘已久的注意力机制,刚开始接触注意力机制的时候,感觉很有意思,事实上学会之后会发现比想象中的要简单,复杂的注意力机制后续会讲解,这期博客先讲解最常见的三种SE、CBAM、ECA注意力机制。 注意力机制更详细的可以被称为资源分配机制,神经网络的…