【代码随想录】螺旋矩阵II

news2024/11/13 18:17:17

本博文为代码随想录的学习笔记,原文链接:代码随想录

题目

原题链接:59. 螺旋矩阵 II

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 20

思路

本题坚持循环不变量原则,模拟顺时针画矩阵的过程:

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

由外向内一圈一圈画下去。

可以发现这里的边界条件非常多,在一个循环中,需要按照固定规则来遍历。这里一圈我们要画四条边,每一条边坚持一致的左闭右开,这样这一拳才能按照统一的规则画下来。如下图,这里每一种颜色代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边继续画,这也是坚持了每条边左闭右开的原则。

题解

为适应机试环境,首先在Dev C++中编写程序

#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> generateMatrix(int n)
{
	vector<vector<int>> nums(n,vector<int>(n,0));
	int loop=n/2;//需要转多少圈
	int mid=n/2;//矩阵中间位置 
	int offset=1;//控制每一条边遍历的长度,每次循环右边界收缩一位 
	int count=1;//给每一个空格赋值 
	int startx=0,starty=0;//每一圈的起始位置 
	while (loop--)
	{
		int i=startx;
		int j=starty;

		for(j;j<n-offset;j++)//从左到右填充上行 
		{
			nums[i][j]=count++;
		 } 
		for(i;i<n-offset;i++)//从上到下填充右行 
		{
			nums[i][j]=count++;
		 } 
		 for(;j>starty;j--)//从右到左填充下行 
		{
			nums[i][j]=count++;
		 } 
		 for(;i>startx;i--)//从右到左填充左行 
		{
			nums[i][j]=count++;
		 } 
		 startx++;
		 starty++;
		 offset++;
		
	}
	if(n%2)
	{
		nums[mid][mid]=count;
	}
	return nums;
}
int main()
{
	int n;	
	cin>>n;
    vector<vector<int>> res(n,vector<int>(n,0));
    res=generateMatrix(n);

	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cout<<res[i][j]<<" ";
		 } 
		 cout<<endl;
	}
	return 0;
}

 

在LeetCode中运行

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> nums(n, vector<int>(n, 0));
        int loop = n / 2; // 需要转多少圈
        int mid = n / 2;  // 矩阵中间位置
        int offset = 1; // 控制每一条边遍历的长度,每次循环右边界收缩一位
        int count = 1;              // 给每一个空格赋值
        int startx = 0, starty = 0; // 每一圈的起始位置
        while (loop--) {
            int i = startx;
            int j = starty;

            for (j; j < n - offset; j++) // 从左到右填充上行
            {
                nums[i][j] = count++;
            }
            for (i; i < n - offset; i++) // 从上到下填充右行
            {
                nums[i][j] = count++;
            }
            for (; j > starty; j--) // 从右到左填充下行
            {
                nums[i][j] = count++;
            }
            for (; i > startx; i--) // 从右到左填充左行
            {
                nums[i][j] = count++;
            }
            startx++;
            starty++;
            offset++;
        }
        if (n % 2) {
            nums[mid][mid] = count;
        }
        return nums;
    }
};

 复杂度分析

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

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

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

相关文章

【Linux】lvm被删除或者lvm丢失了怎么办

模拟案例 接下来模拟lvm误删除如何恢复的案例&#xff1a; 模拟删除&#xff1a; 查看vg名&#xff1a; vgdisplayvgcfgrestore --list uniontechos #查看之前的操作 例如我删除的&#xff0c;现场没有删除就用最近的操作文件&#xff1a; 还原&#xff1a; vgcfgrestore…

1Panel应用推荐:KubePi开源Kubernetes管理面板

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

扩展02:Haporxy+Keepalived+Mysql高可用集群实战

由于这个架构和扩展01的大致步骤都相同&#xff0c;就不讲解了。看如下图再参考扩展01即可。

用C语言实现链式存储结构 万字

各位同学&#xff0c;大家好&#xff0c;我叫小敖。今天给大家分享数据结构之一链式存储结构&#xff0c;下面是对链表简单介绍&#xff0c;希望大家能理解。 链表介绍 链表是一种物理存储单元上非连续、非顺序的存储结构**&#xff0c;数据元素的逻辑顺序是通过链表中的指针链…

大模型快速部署,以浪潮源2.0为例

step1: 申请PAI-DSW试用 step2&#xff1a;魔塔社区授权 由于本地授权一直失败&#xff0c;于是采用了魔塔免费平台实例进行学习。 搭建好之后&#xff0c;打开就有相关页面了&#xff1a; demo搭建&#xff1a; 按照官方提示的步骤进行搭建&#xff0c;内容如下&#xff1a;…

第二十一节、敌人追击状态的转换

一、物理检测中的Boxcast 1、检测敌人Bool 当不知道一个函数的返回值是什么的时候 定义一个var变量 就知道了 二、状态切换 1、switch用法 2、新的语法糖写法

ubuntu2004上的glib编译教程

最近因为工作需要编译glib&#xff0c;写文章记录一下编译流程。 从launchpad上下载源码&#xff1a;链接 根据control文件的提示安装对应的依赖 然后尝试debuild&#xff0c;这里会编译不过出去&#xff0c;不过debuild会自动生成一些编译文件&#xff0c;不要删除。 接下来…

2024云南导游资格证题库

1、释迦三圣是( )。 A、药师佛 B、文殊菩萨 C、释迦牟尼 D、普贤菩萨 E、观音菩萨 答案&#xff1a;BCD 2、下列女士套裙穿法中&#xff0c;错误的是&#xff08; &#xff09;。 A、上衣的袖长不超过着装者的手腕&#xff0c;裙子不盖过脚踝 B、女士在正式场合穿…

八、MyBatis

一、MyBatis介绍 MyBatis 是持久层框架&#xff0c;它支持自定义 SQL、存储过程以及⾼级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置 和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Obj…

数据结构--第七天

递归 -递归的概念 递归其实就是一种解决问题的办法&#xff0c;在C语言中&#xff1a;递归就是函数自己调用自己 -递归的思想 递归的思考方式就是把大事化小的过程 递归的递就是递推的意思&#xff0c;归就是回归的意思 &#xff08;递归是少量的代码完成大量的运算&#xff09…

数据结构(5.5_2)——并查集

逻辑结构——数据元素之间的逻辑关系 并查集&#xff1a; 并查集&#xff08;Union-Find&#xff09;是一种树型的数据结构&#xff0c;用于处理一些不交集的合并及查询问题。它支持两种操作&#xff1a; 用双亲表示存储并查集 首先将所有根节点数组值设为-1&#xff0c;其…

[Android] [解决]Bottom Navigation Views Activity工程带来的fragment底部遮盖的问题

创建了Bottom Navigation Views Activity之后&#xff0c;在fragment_home.xml&#xff0c;加了一个RecyclerView&#xff0c; 后来添加了item之后发现底部会被盖住一部分。 解决&#xff1a;在layout里面加两句&#xff1a; android:paddingBottom"?attr/actionBarSize&…

C#获取Network的相关信息

1&#xff0c;获取网络的通断。 //方法1&#xff1a;无效果&#xff0c;并不能反映当前网络通断 bool availableSystem.Windows.Forms.SystemInformation.Network//方法2&#xff1a;通过VB获取网络状态&#xff0c;可反映当前网络通断 Microsoft.VisualBasic.Devices.Network…

Qt QML 使用QPainterPath绘制弧形曲线和弧形文本

Qt并没有相关api直接绘制弧形文字&#xff0c;但提供了曲线绘制相关类&#xff0c;所以只能另辟蹊径&#xff0c;使用QPainterPath先生成曲线&#xff0c;然后通过曲线上的点来定位每个文字并draw出来。 QML具体做法为从QQuickPaintedItem继承&#xff0c;在派生类中实现paint…

Linux 系统框架分析(一)

一、linux内核结构框图 对内核结构框图有个总体的把握&#xff0c;有助于理解为什么驱动要这样写&#xff0c;为什么写的应用程序所用的C库接口能够产生这么多的事情。 框图可以看出来&#xff0c;linux系统&#xff0c;包括五个系统 一、Linux内核结构介绍 Linux 内核是操作…

【机器学习基础】线性回归

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

Flutter 生成图表(fl_chart)

Flutter 图表 使用fl_chart 先看最终效果 实现抖音’使用管理助手’效果 需求分析&#xff1a;统计每个用户近7天每天的使用时长&#xff08;从当天往后推导&#xff0c;假设今天周二&#xff09;&#xff0c;单位为分钟或者小时&#xff0c;根据平均时长决定 技术选型&…

Python基于TensorFlow实现卷积神经网络-双向长短时记忆循环神经网络回归模型(CNN-BiLSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着深度学习技术的发展&#xff0c;尤其是卷积神经网络&#xff08;Convolutional Neural Networks, …

Android Studio 连接手机进行调试

总所周知&#xff0c;Android Studio里的虚拟手机下载后又大又难用。不如直接连手机用。本篇文章主要内容为Android Studio怎么连接手机进行程序调试。 1. 在AndroidSDK中下载google USB Driver: 2. 连接手机&#xff1a; 进入电脑设备管理器界面。并点开便携设备&#xff0c…

wakanda:1靶机渗透测试

一、靶机下载地址 https://download.vulnhub.com/wakanda/wakanda-1.ova 二、信息收集 1、主机发现 # 使用命令 nmap 192.168.222.0/24 -sn | grep -B 2 "08:00:27:ED:98:E1" 2、端口扫描 # 使用命令 nmap 192.168.222.149 -p- -sV 3、指纹识别 # 使用命令 wha…