看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20

news2024/10/7 10:21:12

目录

    • 前言
    • 算法题(LeetCode刷题59螺旋矩阵II)—(保姆级别讲解)
      • 分析题目:
      • 算法思想(重要)
      • 螺旋矩阵II代码:
    • 结束语

前言

本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!!

算法题(LeetCode刷题59螺旋矩阵II)—(保姆级别讲解)

力扣题目链接

在这里插入图片描述

分析题目:

  1. 元素按照顺时针顺序螺旋排列正方形矩阵
  2. 正方形:就需要保证每一边的长度不变
  3. 遍历过程需要保证循环不变量原则

算法思想(重要)

  1. 什么是循环不变量原则?
    在之前的二分查找中我们就已经运用了循环不变量原则,在这里再提一下:由于在本篇中我们要遍历螺旋矩阵,也就意味着同样一个点不需要重复遍历很多次,所以为了避免这个情况,我们将遍历每条边的规则确定下来,即在本篇中使用左闭右开的规则,这样就可以成功解决问题。
  2. 在本篇中我们需要给定一个正整数n,那么这个正整数有什么作用呢?
    正整数n一共分为两种情况,分别是奇数和偶数。这里举个例子,假设n为奇数,即n = 3,那么最终输出结果应该为[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ],所以我们需要通过这个参数n来确定我们一共需要循环遍历几圈,只不过每圈遍历的规则是一样的。在本篇中循环几圈可以通过n/2确定。
  3. 假设我们现在在循环遍历第一圈,即可以将完整的一圈分为四种情况,分别是上,右,下,左。以上为例,由于我们采取左闭右开的规则,所以最后一个节点下一次遍历开始节点,以此类推。

螺旋矩阵II代码:

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; 
        int mid = n / 2; 
        int count = 1; 
        int offset = 1; 
        int i,j;
        while (loop --) {
            i = startx;
            j = starty;

            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++;
            }

            startx++;
            starty++;

            offset += 1;
        }

        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};
时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
空间复杂度 O(1)

我们还是老样子,对代码逐句进行分析:

 vector<vector<int>> res(n, vector<int>(n, 0)); 

//使用vector定义一个二维数组

int startx = 0, starty = 0; 

在这里插入图片描述

 int loop = n / 2; 

//相当于是确定了遍历螺旋矩阵需要循环的圈数。例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理。假设n为偶数4,那么loop = 2就循环两圈,也就相当于矩阵没有需要单独处理的中间值。

int mid = n / 2; 

//相当于是n为奇数就会遗留出中间值的情况,所以mid相当于是矩阵中间的位置,例如:n为3, 中间的位置就是(1,1)n为5,中间位置为(2, 2)

int count = 1; 

在这里插入图片描述
这里count = 1 相当于第一个数为1,一次递增即可。

int offset = 1; 

// 需要控制每一条边遍历的长度,每次循环右边界收缩一位

在这里插入图片描述

while (loop --) 

//前面已经提过总共循环的圈数。

for (j = starty; j < n - offset; j++) {
                res[startx][j] = count++;
            }

在这里插入图片描述

//初始化offest1,由于遵循左闭右开的原则,所以是j < n - offset,即第一圈为j < n - 1,如上图所示为j的范围为[0,3)

for (i = startx; i < n - offset; i++) {
                res[i][j] = count++;
            }

在这里插入图片描述

初始化offest1,由于遵循左闭右开的原则,所以是i < n - offset,即第一圈为i < n - 1,如上图所示为i的范围为[0,3),并且此时j的值已经为n - offest,所以直接为j即可。

for (; j > starty; j--) {
                res[i][j] = count++;
            }

//由于此时j的值已经为最大值,即n - offset,所以就没必要对j进行初始化。并且此时starty0

 for (; i > startx; i--) {
                res[i][j] = count++;
            }

//由于此时i的值已经为最大值,即n - offset,所以就没必要对i进行初始化。并且此时startx0

 startx++;
 starty++;

//第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0)第二圈起始位置是(1, 1)

 offset += 1;

//offset 控制每一圈里每一条边遍历的长度

if (n % 2) {
            res[mid][mid] = count;
        }

//如果n为奇数的话,需要单独给矩阵最中间的位置赋值

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

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

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

相关文章

英码科技深元ai工作站在化工园区应用,保障安全生产

当今&#xff0c;随着工业化进程的不断推进&#xff0c;化工产业作为重要的基础产业之一&#xff0c;为社会经济发展做出了巨大贡献。然而&#xff0c;随着化工园区规模的不断扩大&#xff0c;化工园区内的安全问题和环境问题也日益突出。因此&#xff0c;如何通过科技手段提升…

网络安全文章汇总导航(持续更新)

网络安全文章汇总导航&#xff08;持续更新&#xff09; 1. 介绍1.1. 初衷1.2. 更新时段1.3.最近更新时间及内容 2. 文章列表2.1. 基础篇2.2. 工具篇2.3. 靶场安装篇2.4. 权限提升篇2.5. 漏洞复现篇2.6. 加固与排查篇2.7. APP渗透篇2.8. 其它基础篇 1. 介绍 本章主要将博客中的…

ROS学习第十二节——话题通信控制小乌龟

1.基操一下 首先打开小乌龟程序和键盘控制程序 rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key 查看话题列表 rostopic list 打开计算图查看具体是那个话题在起作用 rqt_graph 从上图可以看到两个节点之间的话题是 /turtle1/cmd_vel 使用以下命令获…

从零学习SDK(7)如何打包SDK

打包SDK的目的是为了方便将SDK提供给其他开发者或用户使用&#xff0c;以及保证SDK的兼容性和安全性。打包SDK可以有以下几个好处&#xff1a; 减少依赖&#xff1a;打包SDK可以将SDK所需的库、资源、文档等打包成一个文件或者一个目录&#xff0c;这样就不需要用户再去安装或…

直播app源码,流媒体自建好还是用第三方好

随着移动互联网的发展&#xff0c;直播应用已经成为人们日常生活中的一部分。但是&#xff0c;很多人在开发自己的直播app时&#xff0c;面临一个问题&#xff1a;自建直播流媒体服务器还是使用第三方直播平台&#xff1f;在本文中&#xff0c;我们将分析这两种选择的优缺点&am…

TLS简单介绍

第一篇是我同事讲的&#xff0c;第二篇在网上参考的。 两篇一起看&#xff0c;基本能搞懂TLS。 1、 概述 TLS&#xff08;Transport Layer Security&#xff0c;安全传输层)&#xff0c;TLS是建立在传输层TCP协议之上的协议&#xff0c;服务于应用层&#xff0c;它的前身是SS…

C# switch case语句入门and业务必知点

具体的语法形式如下。 switch(表达式) { case 值 1: 语句块 1; break; case 值 2: 语句块 2; break; ... default: 语句块 n; break; } 在这里&#xff0c;switch 语句中表达式的结果必须是整型、字符串…

2023年第一季度京东平台手机品牌销量排行榜

4月19日&#xff0c;调研机构Canalys发布了2023年第一季度的全球智能手机市场报告。根据数据显示&#xff0c;今年Q1全球智能手机市场份额TOP 5分别是三星&#xff08;22%&#xff09;、苹果&#xff08;21%&#xff09;、小米&#xff08;含Redmi&#xff0c;11%&#xff09;、…

git仓库

新的连接&#xff1a;将github账号或者gitee账号与可视化工具连接 操作仓库的大体过程&#xff1a; 连接之后将中央仓库里的东西&#xff0c;clone&#xff08;克隆&#xff09;到自己仓库中&#xff0c; 自己改完代码就push&#xff08;更新&#xff09;进中央仓库 连接之后…

JavaSE学习进阶day06_03 Collections类和Map集合

第三章 Collections类 3.1 Collections常用功能 java.utils.Collections是集合工具类&#xff0c;用来对集合进行操作。 常用方法如下&#xff1a; public static void shuffle(List<?> list):打乱集合顺序。 public static <T> void sort(List<T> list)…

Jenkins 在Windows下安装配置

下载 下载支持JDK1.8最后的版本&#xff0c;这个版本以上的都是JDK11&#xff0c;12的 https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.346.1/jenkins.war运行 进入目录&#xff0c;运行war java -jar jenkins.war如果你的JDK版本不支持的话就会报错了&#x…

蓝桥杯2023年第十四届省赛真题python A组 (个人的做题记录,没有全对,可以通过部分测试点)

试题 A: 特殊日期 本题总分&#xff1a;5 分 【问题描述】 记一个日期为 yy 年 mm 月 dd 日&#xff0c;统计从 2000 年 1 月 1 日到 2000000 年 1 月 1 日&#xff0c;有多少个日期满足年份 yy 是月份 mm 的倍数&#xff0c;同时也是 dd 的倍数。 【答案提交】 这是一道结果…

SSM整合-Spring整合SringMVC、Mybatis,ssm测试

SSM 整合简介 一、SSM整合介绍 ​ SSM&#xff08;Spring SpringMVC Mybatis) 整合&#xff0c;就是三个框架协同开发。 二、框架分工 Spring 整合 Mybatis&#xff0c;就是将 Mybatis 核心配置分拣当中数据源的配置、事务管理、工厂的配置、Mapper接口的实现类等 交给Sp…

ROS学习第十八节——launch文件(详细介绍)

1.概述 关于 launch 文件的使用已经不陌生了&#xff0c;之前就曾经介绍到: 一个程序中可能需要启动多个节点&#xff0c;比如:ROS 内置的小乌龟案例&#xff0c;如果要控制乌龟运动&#xff0c;要启动多个窗口&#xff0c;分别启动 roscore、乌龟界面节点、键盘控制节点。如果…

月薪10k和40k的程序员差距有多大?

程序员的薪资一直是大家关注的焦点&#xff0c;相较于其他行业&#xff0c;程序员的高薪也是有目共睹的&#xff0c;而不同等级的程序员处理问题的方式与他们的薪资直接挂钩。 接下来就一起看一下月薪10k、20k、30k、40k的程序员面对问题都是怎么处理的吧&#xff01; 场景一 …

软件测试面试10分钟不到被赶出来,问的实在是太变态了...泪流满面

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到11月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资…

产品经理必备数据分析技能

推荐教程:产品经理数据分析精讲&#xff08;一&#xff09; 渠道参数 需求背景&#xff1a;目前我们有很多线上线下的渠道去推广我们的产品&#xff0c;吸引用户了解我们的产品。 线上比较常见的如&#xff1a;百度、支付宝、抖音、小红书等&#xff1b;线下比较常见的如&…

android知识体系汇总

前言 对于一个程序员必须要经历的过程&#xff0c;初入职场你觉得能完成任务就行。 第一阶段可称为搬运工阶段&#xff0c;你不需要了解原理&#xff0c;只要做出来就行。浑浑噩噩可能就5年光景了&#xff0c;你发现你做过很多项目&#xff0c;感觉什么都可以。第二阶段可称为…

docker资源管理

目录 docker资源控制 CPU 资源控制 cgroups四大功能 设置CPU使用率上限 进行CPU压力测试 设置CPU资源占用比 设置容器绑定指定的CPU 对内存使用的限制 对磁盘IO配额控制&#xff08;blkio&#xff09;的限制 面试题 docker数据管理 数据卷 数据卷容器 端口映射 容…

C++变量和数据类型进阶

变量和数据类型进阶 有符号整数和无符号整数 short、int、long、long long 类型的变量&#xff0c;可以表示正数&#xff0c;也可以表示负数&#xff0c;称为有符号的整数类型。 unsigned short&#xff0c; unsigned int, unsigned long,unsigned long long类型的变量&…