【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 螺旋矩阵 II

news2024/12/24 9:01:43

前言

欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来螺旋矩阵的分享

目录

  • 前言
  • 59. 螺旋矩阵 II
  • 54. 螺旋矩阵
  • 总结


59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

示例 1:
在这里插入图片描述

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

1 <= n <= 20

思路:

本类型题目其实都不涉及什么算法,就是模拟螺旋顺序打印的过程,下面我们来模拟一下

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

但是我们可以看出,这样一圈一圈的模拟下去,边界条件非常多,很容易出错,这时候我们第一节学的二分法中用的循环不变量规则就非常重要了

矩阵的四条边要么一致遵循左闭右开,要么左开右闭
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> generateMatrix(int n)
    {
        vector<vector<int>> res(n,vector<int>(n,0));
        int startx=0,starty=0;  //定义每循环一个圈的起始位置
        int loop=n/2; //每个圈循环几次,如果n为奇数3,那么loop=1,只循环一圈
        int mid=n/2;  //矩阵中间位置,例如n为3,中间的位置为【1,1】
        int count=1;  //用来给矩阵元素赋值的
        int offset=1; //用来控制循环遍历长度
        int i,j;
        while(loop--)
        {
            i=startx,j=starty;
            //左闭右开
            for(j=starty;j<starty+n-offset;j++) res[startx][j]=count++;
            for(i=startx;i<startx+n-offset;i++) res[i][j]=count++;
            for(;j>starty;j--) res[i][j]=count++;
            for(;i>startx;i--) res[i][j]=count++;
            //第二圈开始,起始位置要各自加一
            startx++,starty++;
            offset+=2;
        }
        //如果n为奇数,则需要单独给矩阵之间的位置赋值
        if(n%2) res[mid][mid]=count;
        return res;
    }
   
};

上面代码中已经把模拟过程详细讲解了一遍,这里再对以下两点特别说明一下:

  • starty+n-offset:为什么这里要加上起始位置,因为第二圈开始起始坐标不为0
  • offset+=2:为什么要加2,因为每走一圈就少了两端的元素,赋初值为1是因为遵循左闭右开的原则
  • 上边有3 * 3和4 * 4的模拟图

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[i].length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

做这道题目我们也是在遵循循环不变量规则,看下面的代码中我们用的前置++,而不是后置++,细品(左开右闭),这里判断循环结束的方法也非常巧妙,判断4个边界是否有冲突,有冲突就退出循环

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        
        vector<int> ans;
        if(!matrix.size()) return ans;
        int up=0,down=matrix.size()-1,left=0,right=matrix[0].size()-1;
        while(true)
        {
            for(int i=left;i<=right;++i) ans.push_back(matrix[up][i]);
            if(++up>down) break;
            for(int j=up;j<=down;++j) ans.push_back(matrix[j][right]);
            if(--right<left) break;
            for(int k=right;k>=left;--k) ans.push_back(matrix[down][k]);
            if(--down<up) break;
            for(int L=down;L>=up;--L) ans.push_back(matrix[L][left]);
            if(++left>right) break;
        }
        return ans;
    }
};

在这里插入图片描述

总结

做这种类型的题目就是要多画图模拟,思路清晰就好办了,还有就是注意边界条件(遵循循环不变量规则)

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

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

相关文章

用微服务架构推进企业数字化转型升级

随着数字化转型进入深水区&#xff0c;企业应用程序建设需求急剧增长且变化多端&#xff0c;软件架构经历了单体结构、垂直架构、SOA架构&#xff0c;发展到了现在的微服务架构。 单体架构目前应用较多&#xff0c;部署容易&#xff0c;但单体式应用内部包含了所有需要的服务&…

四、DML-3.数据操作-删除

delete不能删除某个字段的值 若要删除某个字段的值&#xff0c;用update&#xff0c;将该字段设置为null 原数据表&#xff1a; 一、案例一 删除gender为女的员工 delete from employee where gender 女; 步骤一&#xff1a;输入delete命令并执行&#xff1a; 步骤二&#…

【Python】通过第三方库wxauto自动化操作微信电脑客户端

文章目录 一.简介二.wxauto提供的函数1.WxUtils类功能函数&#xff1a;2.WeChat类主要函数&#xff1a; 三.使用四.遇到的问题 一.简介 wxauto是一个Python第三方库&#xff0c;用于自动化操作微信电脑客户端通过wxauto&#xff0c;我们可以使用Python编写脚本&#xff0c;实现…

如何自学网络安全(黑客)

自学网络安全&#xff08;黑客&#xff09;需要掌握一系列的技能和知识&#xff0c;以下是一些学习网络安全的步骤&#xff1a; 基础知识&#xff1a;首先&#xff0c;你需要对计算机网络和操作系统有基本的了解。学习计算机网络的基本原理、网络协议和网络安全的基本概念。同时…

攻防世界-web-easytornado

题目描述&#xff1a;Tornado 框架。打开链接是一个简单的界面 1. 思路分析 看到有个/flag.txt&#xff0c;我们点击进去看下 发现传入了两个参数&#xff0c;一个是filename&#xff0c;还有一个是filehash 看到里面的内容&#xff0c;提示我们真正的flag在 /flllllllllllla…

报错 The server socket has failed to bind to [::] Pytorch中DDP中断训练报错

Pytorch中DDP &#xff1a;The server socket has failed to bind to [::]:29500 (errno: 98 - Address already in use&#xff09;_cv_lhp的博客-CSDN博客 报错如下 The server socket has failed to bind to [::]:999 (errno: 98 - Address already in use) 这个错误是因为…

虚拟机挂载USB设备/USB serial 连接开发板

虚拟机挂载USB设备 1、添加USB设备 2、终端输入&#xff1a;sudo fdisk -l 查看Device设备&#xff1a; 3、创建挂载目录&#xff1a;mkdir /mnt/usb 4、执行挂载命令&#xff1a;sudo mount /dev/sdb1 /mnt/usb ,查看/mnt/usb目录下是否存在U盘中的数据&#xff1a; 5、用…

构建产品帮助中心时要避免的 8 个最常见错误

构建帮助中心是提供给客户和用户有价值信息的重要途径&#xff0c;但在建设过程中&#xff0c;有一些常见的错误需要避免。本文将介绍构建帮助中心时要避免的8个最常见错误&#xff0c;帮助您打造一个更优秀的帮助中心。 1. 以老式方式进行&#xff08;FAQ/Q&A 页面样式&am…

【uni-app】1、分页组件z-paging介绍与使用

1、z-paging 介绍 1、一个 uni-app &#xff08;opens new window&#xff09;分页组件。 2、全平台兼容&#xff0c;支持自定义下拉刷新、上拉加载更多&#xff0c;支持虚拟列表&#xff0c;支持自动管理空数据图、点击返回顶部&#xff0c;支持聊天分页、本地分页&#xff0c…

AI对话+AI绘画,提高你的生产力

智心AI平台 使用 Nestjs 和 Vue3 搭建的 AIGC 生态社区 在线使用&#xff1a;用户端体验 当前特色支持功能 GPT3/4模型支持与控制联网对话支持思维导图生成支持openai DALL-E2绘画支持Midjourney绘画支持全套卡密系统支持在线支付支持完善的后台管理系统支持 源码购买或者…

Unity---Spine动画

目录 1.介绍 2.优点 3.spine导出的unity资源 4.导入 5.导入报错的解决方案 6.使用 7.代码示例 1.加载Spine骨骼动画&#xff1a; 2.控制Spine动画的播放&#xff1a; 3.暂停和恢复动画播放&#xff1a; 4.监听动画事件&#xff1a; 5.切换皮肤&#xff08;换装&…

Rsync(二十七)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、特性 三、应用场景 四、数据的同步方式 五、rsync传输模式 六、rsync应用 七、rsync 命令 1. 格式 1.1 作为远程命令 1. 2 作为rsync服务 2. 选项 3.…

​通达信量比捉牛股指标源码​_通达信公式

JL5:MA(V,5); LB:DYNAINFO(17); 历史量比:IF(DYNAINFO(4)OANDDYNAINFO(5)HANDDYNAINFO(6)LANDDYNAINFO(7) C,DYNAINFO(17),V/JL5),LINETHICK,COLORYELLOW; STICKLINE(历史量比>1,历史量比,0,3,1)COLORRED; STICKLINE(历史量比<1,历史量比,0,3,0)COLO…

Debug调试的使用(IDEA 基础篇 喂奶级教程)

引言 在编程中&#xff0c;Debug&#xff08;调试&#xff09;是指在程序运行时&#xff0c;通过一系列的工具和技术&#xff0c;对程序进行逐行调试和分析&#xff0c;从而发现和修复程序中的错误和问题。Debug 功能是程序开发中非常重要的一个环节&#xff0c;它可以帮助开发…

JSON对象的stringify()和parse()方法使用

JSON对象的stringify和parse方法使用 JSON 格式JSON 对象JSON.stringify()1.JSON.stringify(value)2.JSON.stringify(value,replace)3.JSON.stringify(value,replace,space)4.注意的点 JSON.parse() JSON 格式 JSON 格式&#xff08;JavaScript Object Notation 的缩写&#xf…

一文读懂【TypeScript】的发展设计理念

导语&#xff1a; 在了解 TypeScript 之前&#xff0c;我们需要了解 什么是强类型语言和什么是弱类型语言&#xff0c;以及什么是静态类型&#xff0c;什么又是动态类型。 强类型不允许任意的隐式类型转换&#xff0c;而 弱类型 允许静态类型&#xff1a;一个变量声明时它的类型…

STM32使用高级定时器输出互补pwm波

STM32使用高级定时器输出互补pwm波 前言硬件和软件cubemx新建工程打开Debug模式配置时钟源六大时钟的作用选择Crystal/Ceramic Resonator&#xff0c;即使用外部晶振作为HSE的时钟源。 配置时钟配置高级定时器TIM8和通用定时器TIM3这里大概解释一下配置pwm输出用到的几个参数我…

ASEMI快恢复二极管MUR20100CTR在电子工程中的应用

编辑-Z 随着电子技术的日益发展&#xff0c;各种电子元件的使用场景与需求也在逐步扩大。今天&#xff0c;我们将聚焦于一款广泛应用于各类电路的二极管——MUR20100CTR&#xff0c;来详细解读其性能特征及应用。 一、MUR20100CTR二极管的主要特性 MUR20100CTR是一款极高性能的…

03 QT对象树

Tips: QT通过对象树机制&#xff0c;能够自动、有效的组织和管理继承自QObject的Qt对象&#xff0c;不需要用户手动回收资源&#xff0c;系统自动调用析构函数。 验证对象树功能&#xff1a; 新建C文件 继承自QPushButton&#xff0c;但没有QPushButton&#xff0c;但有其父类…

简单高效的交易系统,只需这种行情分析工具

行情分析的意义在于&#xff0c;首先它给我们不得不做出的方向性选择提供一些技术的支持。其次&#xff0c;它可以给我们提出一个入市点&#xff0c;一个理想的盈利点&#xff0c;一个认输的失败点。无论你用什么办法进行行情预测或指导&#xff0c;只要你的分析结果中有这样三…