leetcode螺旋矩阵总结

news2024/9/25 23:11:35

螺旋矩阵题目:

leetcode54,59,885,2326

leetcode54

在这里插入图片描述
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入: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]

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int n=matrix.size();//n行
        int m=matrix[0].size();//m列
        vector<int>vec;
        int t=0;
        int b=n-1;
        int l=0;
        int r=m-1;int count=n*m;
        while(count>=1)
        {
            for(int i=l;i<=r && count>=1;i++){vec.push_back(matrix[t][i]);count--;}
            t++;
            for(int i=t;i<=b &&count>=1;i++){vec.push_back(matrix[i][r]);count--;}
            r--;
            for(int i=r;i>=l && count>=1;i--){vec.push_back(matrix[b][i]);count--;}
            b--;
            for(int i=b;i>=t && count>=1;i--){vec.push_back(matrix[i][l]);count--;}
            l++;    
        }

        return vec;
    }
};

leetcode59

在这里插入图片描述
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
给你一个正整数 n ,生成一个包含 1 到 n*n所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int t = 0;      // top上边界
        int b = n-1;    // bottom下边界
        int l = 0;      // left左边界
        int r = n-1;    // right右边界
        vector<vector<int>>vec(n,vector<int>(n));
        int m=1;
        while(m<=n*n)
        {
            // for(l;l<=r;l++;i++){vec[t][l]=i;} //这样写l会随着自增改变
            // t++;
            // for(t;t<=b;t++;i++){vec[t][l]=i;}//i与左右上下边界的移动无关,只是一个标记变量
            for(int i=l;i<=r;i++,m++){vec[t][i]=m;}
            t++;
            for(int i=t;i<=b;i++,m++){vec[i][r]=m;}
            r--;
            for(int i=r;i>=l;i--,m++){vec[b][i]=m;}
            b--;
            for(int i=b;i>=t;i--,m++){vec[i][l]=m;}
            l++;
        }
        return vec;
    }
};

leetcode 885. 螺旋矩阵 III

输入:rows = 1, cols = 4, rStart = 0, cStart = 0
输出:[[0,0],[0,1],[0,2],[0,3]]
在这里插入图片描述
输入:rows = 5, cols = 6, rStart = 1, cStart = 4
输出:[[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]

class Solution {
public:
    vector<vector<int>> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
        vector<vector<int>>vec;//注意在这里不能vector<vector<int>>vec(rows*cols,vector<int>(2,0));写成这样则vec.push_back({rStart,cStart})会在之后加入元素,前面的都为0,
        int count=rows*cols;
        int step=1;
        while(count>=1)
        {
           
           int right=cStart+step;//右边界 往右
           for(cStart;cStart<right;cStart++){ //这个地方的边界判断条件是小于,不是小于等于
               if(rStart>=0 && rStart<rows && cStart>=0 && cStart<cols)
                {
                    vec.push_back({rStart,cStart});
                    count--;
                }
               }
            int bottom=rStart+step;///往下
            for(rStart;rStart<bottom;rStart++)
            {
                if(rStart>=0 && rStart<rows && cStart>=0 && cStart<cols)
                {
                    vec.push_back({rStart,cStart});
                    count--;
                }
            }
            step++;//增加步长
            int left=cStart-step;//往左
            for(cStart;cStart>left;cStart--)
            {
                if(rStart>=0 && rStart<rows && cStart>=0 && cStart<cols)
                {
                    vec.push_back({rStart,cStart});
                    count--;
                }
            }
            int top=rStart-step;///往上
            for(rStart;rStart>top;rStart--)
            {
                if(rStart>=0 && rStart<rows && cStart>=0 && cStart<cols)
                {
                    vec.push_back({rStart,cStart});
                    count--;
                }
            } 
            step++;//最后还要step++增加步长
        }

        return vec;
    }
};

leetcode2326. 螺旋矩阵 IV

在这里插入图片描述
输入:m = 3, n = 5, head = [3,0,2,6,8,1,7,9,4,2,5,5,0]
输出:[[3,0,2,6,8],[5,0,-1,-1,1],[5,2,4,9,7]]
解释:上图展示了链表中的整数在矩阵中是如何排布的。
注意,矩阵中剩下的空格用 -1 填充。
给你两个整数:m 和 n ,表示矩阵的维数。
另给你一个整数链表的头节点 head 。
请你生成一个大小为 m x n 的螺旋矩阵,矩阵包含链表中的所有整数。链表中的整数从矩阵 左上角 开始、顺时针 按 螺旋 顺序填充。如果还存在剩余的空格,则用 -1 填充。返回生成的矩阵。

struct ListNode {
      int val;
     ListNode *next;
     ListNode() : val(0), next(nullptr) {}
     ListNode(int x) : val(x), next(nullptr) {}
     ListNode(int x, ListNode *next) : val(x), next(next) {}
  };
class Solution {
public:
    vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) {
        ListNode* cur=head;
        int count=m*n;
        int t=0;
        int b=m-1;
        int l=0;
        int r=n-1;
        bool flag=false;//增加一个标志位
        vector<vector<int>>vec(m,vector<int>(n,-1));
        while(count>=1)
        {
            for(int i=l;i<=r;i++)
            {
                if(cur==nullptr){flag=true;break;}
                vec[t][i]=cur->val;cur=cur->next;count--;       
            }
            if(flag){break;}
            t++;
            for(int i=t;i<=b;i++)
            {
                if(cur==nullptr){flag=true;break;}
                vec[i][r]=cur->val;cur=cur->next;count--;
            }
            if(flag){break;}
            r--;
            for(int i=r;i>=l;i--)
            {
                if(cur==nullptr){flag=true;break;}
                vec[b][i]=cur->val;cur=cur->next;count--;
            }
            if(flag){break;}
            b--;
            for(int i=b;i>=t;i--)
            {
                if(cur==nullptr){flag=true;break;}
                vec[i][l]=cur->val;cur=cur->next;count--;
            }
            if(flag){break;}
            l++;
        }
        
        return vec;
    }
};

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

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

相关文章

MSTP技术中引入的必要性

目前&#xff0c;城域光传送网大量存在的是传统的SONET/SDH环网和简单的MSTP网络&#xff0c;对带宽的指配基本上是静态的&#xff0c;无法适应大量的突发性数据业务&#xff0c;需要大量的人工操作和维护&#xff0c;耗时耗力、容易出错。为了改变现状&#xff0c;人们不断在传…

第二章 Flink 环境部署

Flink 系列教程传送门 第一章 Flink 简介 第二章 Flink 环境部署 第三章 Flink DataStream API 第四章 Flink 窗口和水位线 第五章 Flink Table API&SQL 第六章 新闻热搜实时分析系统 一、Flink架构 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源…

python-turtle画图

认识TurtleTurtle是一个渲染器基于底层图形编程结构(API)构建&#xff0c;主要用于场景的构建以及3D物体的绘制(3D游戏、虚拟场景等)Turtle是一个窗体程序Turtle是Python语言中的一个很流行的绘制图像的函数库&#xff0c;想象一个小海龟在一个横轴为x&#xff0c;纵轴为y的坐标…

时序数据库 TDengine 携手北京科技大学设计研究院,助力冶金工业智慧化

北京科技大学设计研究院有限公司作为北京科技大学全资产业化技术推广机构&#xff0c;从 2013 年开始在冶金、钢铁行业进行业务系统开发和实施&#xff0c;围绕先进材料、绿色低碳和智能制造不断深耕细作&#xff0c;持续创新。其拥有高效轧制与智能制造国家工程研究中心、国家…

DPDK工作原理和环境搭建

DPDK工作原理DPDK环境搭建编译DPDKDPDK工作原理DPDK实践之处理UDP数据总结DPDK环境搭建 工具准备&#xff1a;VMware、ubuntu16.04。 &#xff08;1&#xff09;VMware添加两个网卡。桥接网卡作为 DPDK 运行的网卡&#xff0c;NAT 网卡作为 ssh 连接的网卡。 &#xff08;2&…

后台交互—springboot+mybatis整合小程序(源码演示)

后台准备pom.xml<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM…

【案例实战】SpringBoot整合GRPC微服务远程通信

1.什么是GRPC GRPC是RPC框架中的一种&#xff0c;是一个高性能&#xff0c;开源和通用的RPC框架&#xff0c;基于Protobuf序列化协议开发&#xff0c;且支持众多开发语言。 面向服务端和协议端&#xff0c;基于http/2设计&#xff0c;带来诸如双向流&#xff0c;流控&#xff…

足球视频AI(三)——YOLOV7目标检测自训练模型

一、基础概念 YoloV7提供的yolov7-tiny.onnx 对于图像中包含较大尺寸的足球检测准确率高。 但在实际应用中&#xff0c;足球视频中的足球非常小&#xff0c;默认的模型难于满足实际的足球检测需求。 1.1 识别目标 1&#xff09;固定机位的视频中足球的逐帧识别 1.2 实现思…

邮箱2023系统

邮箱2023系统 前言 VMMail作为一款开源的邮件系统&#xff0c;目前已经发布到了10.0版本。 该版本在 GitHub上是免费的&#xff0c;且代码也是开源的&#xff0c;所以该程序不会对 GitHub上的所有用户造成任何影响。 由于 VMMail开发时采用了开源代码&#xff0c;并在 GitHub上…

区块链之bolt数据库持久化与基本功能完善

文章目录bolt数据库安装使用bolt进行持久化存储bolt持久化的基本步骤创世区块的持久化新增区块的持久化完善区块链基本功能创世区块创建增加区块遍历区块链链接&#xff1a; 区块链项目github地址项目目前进度&#xff1a;bolt数据库安装 bolt数据库介绍&#xff1a; bolt数据…

Vue3过渡动画实现

文章目录P14Vue3过渡&动画实现过渡动画的使用过渡CSS动画效果同时设置过渡和动画mode和appearanimate.cssgsapgsap实现数字变化认识列表的过渡列表过渡的移动动画列表的交错过渡案例P14Vue3过渡&动画实现 过渡动画的使用 <template><button click"isShow…

进入新组织项目经理如何快速提升自己的影响力?

我们在工作中&#xff0c;经常以“对事不对人”来体现他们的专业性&#xff0c;但是这点并不符合人性。更多时候对人不对事&#xff0c;反倒能提高问题的解决能力。项目经理会发现&#xff0c;很多事情的推进&#xff0c;都建立在和对方的信任的基础上&#xff0c;所以先成为对…

使用Qt开发的linux嵌入式设备监控、管理框架,监测嵌入式设备运行状态,执行远程shell,远程升级,与客户端进行文件传输

linux SPY 简介 使用Qt开发的linux嵌入式设备监控、管理框架 [客户端]&#xff1a;aes_tcp_lib 完整代码下载地址&#xff1a;使用Qt开发的linux嵌入式设备监控、管理框架 开发环境 ubuntu 20Qt 5.12Qt Creator 4.13.1 核心功能 监测嵌入式设备运行状态转发客户端消息,…

划重点!企业在采购管理中应避免的10个错误

一家企业的采购能力在很大程度上取决于其采购管理系统的有效性。当系统运行良好时&#xff0c;那么采购就会相当顺利。如果你使用的是一个低效的系统&#xff0c;那就会导致一大堆常见的采购问题。 无论采购错误的根本原因是什么&#xff0c;任其发展&#xff0c;最终会给企业…

【ZooKeeper】第二章 JavaAPI 操作

【ZooKeeper】第二章 JavaAPI 操作 文章目录【ZooKeeper】第二章 JavaAPI 操作一、Curator 简介二、Curator API1.建立连接2.创建节点3.查询节点4.修改节点5.删除节点6.Watch 事件监听三、分布式锁四、案例&#xff1a;12306售票一、Curator 简介 Curator 是 Apache ZooKeeper…

【云原生进阶之容器】第二章Controller Manager原理2.3节--Reflector分析

1 Reflector组件 1.1 背景 Reflector 是保证 Informer 可靠性的核心组件,在丢失事件,收到异常事件,处理事件失败等多种异常情况下需要考虑的细节很多。单独的listwatcher缺少重新连接和重新同步机制,有可能出现数据不一致问题。其对事件响应是同步的,如果执行复杂的操作会…

把财务分析明白的BI软件有哪些?

有财务分析这一个地狱级的在&#xff0c;什么销售、采购、库存都是渣渣。在财务分析中&#xff0c;指标运算组合可以有多样化的改变&#xff0c;资金来来回回能把人绕晕&#xff0c;一个极不起眼的疏忽都可能导致所有工作推到重来的可怕后果。即使是在擅长做大数据智能可视化分…

MySQL基础命令

MySQL基础命令 创建数据库 Show databases;查看 选择数据库 Use test; 在test数据库中创建表 create table t_stu( id int, name varchar(20) ); 查看表信息 desc t_stu&#xff1b; 添加字段 alter table t_stu add age int; 字段age成功添加 修改字段 alter tab…

springBoot使用rabbitmq并保证消息可靠性

一、理论说明 1.1、数据的丢失问题&#xff0c;可能出现在生产者、MQ、消费者中 1、如下图 1.2、生产者弄丢了数据 1、生产者将数据发送到 RabbitMQ 的时候&#xff0c;可能数据就在半路给搞丢了&#xff0c;因为网络问题啥的&#xff0c;都有可能。此时可以选择用RabbitM…

VS2019打包程序变成带运行环境的安装包

背景 给外行客户写程序的时候&#xff0c;为了避免客户麻烦&#xff0c;我们在写完程序之后&#xff0c;需要把运行环境也打包进安装包中&#xff0c;这样客户就可以一键安装使用。给客户减少麻烦的同时&#xff0c;无疑让我们也有了更多的好评。 步骤 1.写好我们要打包的程…