LeetCode 59.螺旋矩阵II

news2024/11/11 22:17:31

LeetCode 59.螺旋矩阵II

1、题目

力扣题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 20

2、模拟

思路

这道题的目的是生成一个按照螺旋顺序填充的二维矩阵。给定一个整数n,它创建一个 n x n 的矩阵,并从左上角开始,按照顺时针方向螺旋填充数字,从1开始,直到填充完整个矩阵(n^2)。
我们可以通过模拟法来顺时针画出螺旋矩阵:

  • 填充上边界:从左到右
  • 填充右边界:从上到下
  • 填充下边界:从右到左
  • 填充左边界:从下到上

由外而内填充矩阵。
在这里要注意边界条件,否则很容易蒙圈。
每一圈,我们都要画四条边,每条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
下面按照左闭右开的原则,来画一圈,大家看一下:
image.png
这里每一种颜色,都代表一条边,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。这也是坚持了每条边左闭右开的原则。

代码

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        // 初始化一个n x n的二维数组,所有元素初始化为0
        vector<vector<int>> res(n, vector<int>(n, 0));
        // 定义螺旋矩阵的起始位置 (startx, starty),也可以理解为横纵坐标
        int startx = 0, starty = 0;
        // 循环的次数,n 为奇数时,中间会有一个单独的元素需要单独处理,所以除以2
        int loop = n / 2;
        // n为奇数时,中间元素的坐标,例如:n为3, 中间的位置就是(1,1)
        int mid = n / 2; 
        // 定义当前填充的数字,从 1 开始
        int count = 1; 
        // 定义每次圈数增加时的偏移量,每次循环右边界收缩一位
        int offset = 1;
        int i,j;

        // 开始螺旋填充,每填充完一圈,loop 减 1
        while (loop --) {
            // 当前圈的起始横坐标和纵坐标
            i = startx;
            j = starty;
    
            // 下面开始的四个for就是模拟转了一圈
            // 从左到右填充上边界(左闭右开)
            for (j = starty; j < n - offset; j++) {
                res[startx][j] = count++;
            }
            // 从上到下填充右边界(左闭右开)
            for (i = startx; i < n - offset; i++) {
                res[i][j] = count++;
            }
            // 从右到左填充下边界(左闭右开)
            for (; j > starty; j--) {
                res[i][j] = count++;
            }
            // 从下到上填充左边界(左闭右开)
            for (; i > startx; i--) {
                res[i][j] = count++;
            }
    
            // 更新下一圈的起始位置,例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
            startx++;
            starty++;
    
            // offset 控制每一圈里每一条边遍历的长度
            offset += 1;
        }
    
        // 如果 n 是奇数,则填充中心位置
        if (n % 2) {
            res[mid][mid] = count;
        }
        
        // 返回填充好的螺旋矩阵
        return res;
    }
};

复杂度分析

  • 时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
  • 空间复杂度 O(1)

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

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

相关文章

02_按键控制LED

按键控制LED 按键控制LED 按键控制LED while (1){//按键控制LEDif(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)GPIO_PIN_RESET)//读取PC5引脚状态&#xff0c;即检测按键是否按下{while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)GPIO_PIN_RESET);//松手检测HAL_GPIO_WritePin(GPIOA,GPIO_PI…

使用IT-Tools+Cpolar在Windows搭建自己的IT工具箱并实现远程在线使用

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

Java-多线程-并发知识点02(面试/学习)

本文主要介绍了Java多线程中的线程池、Java中的锁、synchronized锁及相关问答等知识点 Java-多线程-并发知识点02 线程池如何创建线程池使用 ThreadPoolExecutor 类创建线程池使用 Executors 工厂类创建线程池 线程池有些什么参数&#xff1f;线程池的使用方法线程池常用的阻塞…

测试知识1

瀑布模型 瀑布模型是一个经典的软件开发生命周期模型&#xff0c;它将开发过程分为一系列顺序执行的阶段&#xff0c;每个阶段都有特定的任务和产出物。这些阶段通常包括需求分析、系统设计、实现、测试、部署和维护等。 在瀑布模型中&#xff0c;每个阶段的输出都作为下一个…

【VUE】Vue3自由拖拽标签

效果&#xff1a; 代码&#xff1a; <template> <div><div v-move class"box"><label class"move">拽我</label> </div> </div> </template> <script setup lang"ts">import { ref, …

如何通过Linux pciehp sysfs接口控制PCIe Slot电源状态?-2

NVME SSD电源状态判断 通过pciehp sysfs接口对NVMe SSD所在的PCIe插槽进行Power On/Off操作时&#xff0c;确实会间接影响到NVMe SSD本身的电源状态。因为NVMe SSD是作为PCIe设备连接到特定插槽上的&#xff0c;插槽电源状态的变化通常会直接影响到与其相连的设备。 当对PCIe…

【Css】table数据为空,以“-“形式展现

解决&#xff1a;class类名 它表示的是在一个名为class类名的元素内部&#xff0c;当该元素为空时&#xff0c;会在该元素的:before伪元素上应用一些样式。 这种写法通常用于在元素内容为空时&#xff0c;添加一些占位符或者提示文字

史上最全excel导入功能测试用例设计(以项目为例)

web系统关于excel的导入导出功能是很常见的&#xff0c;通常为了提高用户的工作效率&#xff0c;在维护系统中的一些数据的时候&#xff0c;批量导入往往比一个一个添加或者修改快很多。针对导入功能的测试&#xff0c;往往会有很多种情况&#xff0c;现在针对平时项目中遇到的…

五款靠谱平台,做地推网推赚钱的都不要错过

现在生活压力都很大&#xff0c;很多人的主业都已经满足不了生活的开支了&#xff0c;做副业增加收入成了大家的选择。对于没有特长的小伙伴来说&#xff0c;选择一个适合自己的副业非常重要。 在这种环境下&#xff0c;现在非常火爆的地推网推就成了很多人的选择。但对于不太…

【论文速读】| CovRL:基于覆盖引导的强化学习对LLM基础变异进行JavaScript引擎模糊测试

本次分享论文为&#xff1a;CovRL: Fuzzing JavaScript Engines with Coverage-Guided Reinforcement Learning for LLM-based Mutation 基本信息 原文作者&#xff1a;Jueon Eom, Seyeon Jeong, Taekyoung Kwon 作者单位&#xff1a;延世大学、苏瑞软科技公司 关键词&#…

SpringBoot + Vue实现的校园(接单跑腿)服务平台管理系统设计与实现+(12000字)毕业论文+开题报告+搭建视频​(包运行成功)

介绍 本系统包含管理员、接单员、普通用户三个角色。 管理员角色&#xff1a;管理员管理、基础数据管理、接单详情管理、接单员管理、公告信息管理、用户管理、用户投诉管理、余额变更记录管理。 接单员角色&#xff1a;接单详情管理、接单员管理、跑腿任务管理。 普通用户…

分类算法(数据挖掘)

目录 1. 逻辑回归&#xff08;Logistic Regression&#xff09; 2. 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 3. 决策树&#xff08;Decision Tree&#xff09; 4. 随机森林&#xff08;Random Forest&#xff09; 5. K近邻&#xff08;K-Nearest …

JavaScript(五)-正则表达式

文章目录 正则表达式正则表达式的介绍语法元字符修饰符 正则表达式 正则表达式的介绍 什么是正则表达式 正则表达式&#xff08;Regular expression&#xff09;是用于匹配字符串中字符组合的模式&#xff0c;在JavaScript中&#xff0c;正则表达式也是对象通常用来查找、替…

【Golang学习笔记】从零开始搭建一个Web框架(三)

文章目录 分组控制分组嵌套中间件 前情提示&#xff1a; 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;一&#xff09;-CSDN博客 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;二&#xff09;-CSDN博客 分组控制 分组控制(Group Control)是 Web 框架应提供…

传销?链动2+1模式 合法合规的商业模式!

大家好&#xff0c;我是吴军&#xff0c;来自一家深耕于软件开发领域的公司&#xff0c;担任产品经理的职务。 今天&#xff0c;我希望与大家共同探讨一个具有深刻意义的话题——链动21模式&#xff0c;并探究其如何有效应对用户留存与复购的挑战。 或许有人会说&#xff0c;链…

UE5学习日记——实现自定义输入及监听输入,组合出不同的按键输入~

UE5的自定义按键和UE4有所不同&#xff0c;在这里记录一下。 本文主要是记录如何设置UE5的自定义按键&#xff0c;重点是学会原理&#xff0c;实际开发时结合实际情况操作。 输入映射 1. 创建输入操作 输入操作并不是具体的按键映射&#xff0c;而是按键的激活方式&#xff0…

如何落地一个FaaS平台?

简介&#xff1a; 函数即服务&#xff08;FaaS&#xff09;作为云计算 2.0 时代重要的发展方向&#xff0c;能够从工程效率、可靠性、性能、成本等方面给开发者带来巨大的价值&#xff0c;尤其是能够极大地提升研发效率。因此&#xff0c;拥抱FaaS成为开发者关心的重要技术领域…

01-Git 之快速入门操作本地仓库

https://learngitbranching.js.org/?localezh_CN在线练习git 1. Git 安装好Git以后, 先检查是否已经绑定了用户名和邮箱 git config --list1.1 为什么要使用版本控制&#xff1f; 从个人角度&#xff1a; 在做项目时&#xff0c;如果一点点去改代码会很乱&#xff0c;不利…

华为云开年采购季:企业级市场的火爆营销炼成记

作者 | 曾响铃 文 | 响铃说 销售火爆&#xff0c;一单又一单&#xff0c;“生意好个不停”。 这一幕&#xff0c;常常发生在C端消费品市场上&#xff0c;要么是线上爆单&#xff0c;要么是线下人头攒动。 而现在&#xff0c;在B端企业级市场上也发生了类似的情景。 自3月1…

ZJJ-2A直流绝缘监视继电器额定电流3.1mA额定电压110VDCJOSEF约瑟

系列型号 JJJ-1绝缘监视继电器&#xff1b; ZJJ-1/A绝缘监视继电器&#xff1b; ZJJ-1A绝缘监视继电器&#xff1b; ZJJ-2型直流绝缘监视继电器 ZJJ-2直流绝缘监视继电器&#xff1b; ZJJ-2B直流绝缘监视继电器&#xff1b; ZJJ-2AC直流绝缘监视继电器&#xff1b; 用途…