LeetCode之螺旋矩阵 II 简单易懂与晦涩难懂两种方法解决

2023-10-26

目录

题目

方法一:简单易懂,四方步步紧逼法

代码

方法二:复杂一点,上下法

代码

题目

给你一个正整数 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

方法一:简单易懂,四方步步紧逼法

以人的视角去看,就是从外圈到内圈填数,从1填到n*n。

其实就是a[i][j]=num++;

然后难度就是怎么确定i和j的变化。

我们把这个螺旋矩阵拆成一个一个同心正方形框套起来,类似于‘回’字,就是上下左右四条边,分别给它来一个循环填充好每一条边,然后缩小边界,再填内框,直到填满。

如果还不太明白,没关系,我们来逐条解释代码。

设四个变量up down left right来控制边界。

初始化时让上边up和左边left赋值为0,右边right和下边down赋值为n-1。

填充的操作就是四个循环,从左到右,从上到下,再从右到左,最后从下到上,这样一个绕圈完成一个框填。

缩小边界的操作是up++,left++,right--,down--。

直到我们的down大于up,left大于right后退出主循环。

还有一点要注意的就是,我们这样的填法在奇数的时候无法填充中间的那个数,因此我们还是需要加上一个判断,如果是奇数,那么就手动在中间的位置填上去,这也是为什么方法一的代码会比方法二的代码长一点点。

代码

#include<iostream>
using namespace std;
int main()
{
	int n,i,j,up,down,left,right;
	cin>>n;
	up=left=0;
	down=right=n-1;		
	int p[n][n],num=1;
	while(down>up&&right>left)
	{			
	    for(i=left;i<right;i++)
		p[up][i]=num++;			
		for(i=up;i<down;i++)
		p[i][right]=num++;
		for(i=right;i>left;i--)			
		p[down][i]=num++;
		for(i=down;i>up;i--)
		p[i][left]=num++;			
		up++;
		down--;
		left++;			
		right--;
	}
	if(n%2!=0)
	p[n/2][n/2]=n*n;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-1;j++)
		cout<<p[i][j]<<' ';
		cout<<p[i][j]<<endl;
	}
}

方法二:复杂一点,上下法

在这里,我们仍然采用两层循环的方式,外循环是圈数的变化,内循环实现每一圈的填数。

以人的视角去看,填数是先右再下再左再上的循环方式,所以我们需要四个循环,分别来完成上下左右的绕圈。

实际上在写代码时,外循环的i是半圈数,每一个半圈走两个方向。

下面的代码在i是偶数的时候填的是上右两个循环,i是奇数的时候填的是下左两个循环。

代码

#include<iostream>
using namespace std;
int main()
{
	int n,i,j;
	cin>>n;
	int p[n][n],num=1,N=n;
	for(i=0;i<N;i++)
	{
		if(i%2==0)
		{
			for(j=i/2;j<n-1;j++)
			p[i/2][j]=num++;
			for(j=i/2;j<n;j++)
			p[j][n-1]=num++;	
			n--;		
		}
		else
		{
			for(j=N-(i+1)/2-1;j>(i+1)/2-1;j--)
			p[N-(i+1)/2][j]=num++;
			for(j=N-(i+1)/2;j>(i+1)/2-1;j--)
			p[j][(i+1)/2-1]=num++;					
		}
	}
	for(i=0;i<N;i++)
	{
		for(j=0;j<N-1;j++)
		cout<<p[i][j]<<' ';
		cout<<p[i][j]<<endl;
	}	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode之螺旋矩阵 II 简单易懂与晦涩难懂两种方法解决 的相关文章

随机推荐

  • 基于Python的淘宝自动回复助手

    前言 看到有人从blink上发需要用python做一个类似于淘宝自动回复助手的作业 好久没玩python了 就写了一下 实现了 1 退货 2 查库存 3 商品查看 这三个功能 整理一下心路历程 搞到一份源码 def find answer
  • 安装 Django1.11

    Django1 11 安装Django的步骤 联网 在命令行窗口中直接运行 pip install django 1 11 i https pypi tuna tsinghua edu cn simple 或使用离线方式安装 执行命令 pi
  • 初级(上) 二维码的生成

    吼吼 阳仔的第一篇博客开写啦 以下的内容都是我从imooc上面听课的总结 当然是只针对二维码 作为一个初级程序媛 也是要坚持学习的 首先 谢谢imooc网上的老师发放的免费视频 让我自己有了一些简单的了解 接下来 就把我的总结贴出来吧 第一
  • 微信公众号开发之绑定微信开发者

    第一步 登录微信公众号 绑定网页开发者 在登录后的界面中 我们向下拉在左侧会看到有一个 开发者工具 点击 这时在开发者工具中 会看到有好几个工具 其中有一个 web开发者工具 我们点击进入 在这里 我们就会看到有一个 绑定开发者微信号 按钮
  • LDO的原理及应用

    01 LDO定义 LDO即lowdropoutregulator 是一种低压差线性稳压器 这是相对于传统的线性稳压器来说的 传统的线性稳压器 如78XX系列的芯片都要求输入电压要比输出电压至少高出2V 3V 否则就不能正常工作 但是在一些情
  • Javascript:window.close()不起作用?

    一般的窗口关闭的JS如下写法 window close 但是呢 chrome firefox等中有时候会不起作用 改为下面的写法 window open about blank self close 或者 window open self
  • 服务端 TCP 连接的 TIME_WAIT 过多问题的分析与解决

    https blog csdn net zxlyx article details 120397006 本文给出一个 TIME WAIT 状态的 TCP 连接过多的问题的解决思路 非常典型 大家可以好好看看 以后遇到这个问题就不会束手无策了
  • ubuntu安装anaconda及创建桌面快捷启动图标

    第一步 下载anaconda 1 因为跑代码的原因 我要下载python3 6的anaconda 如果大家也有版本的要求 首先需要查看python与anaconda的版本对应关系 详细可见https blog csdn net yuejis
  • verilog实例-仲裁(Arbiter)

    目录 1 仲裁 2 仲裁方案 3 严格优先级轮询 1 design detil 2 time 3 code 4 公平轮询 1 design detil 2 time 3 code 5 公平轮询 仲裁w o死周期 1 design detil
  • 【Arduino实验05 基于环境光的LED灯亮度感应控制】

    目录 一 实验目的 二 实验设备与环境 三 实验重点 四 实验难点 五 实验内容 5 1实验任务 5 2实验原理 5 3实验内容 5 4实验结果 5 5思考题 一 实验目的 1熟悉光敏传感器原理与功能 2理解串联电路获取传感器数据原理 3
  • 基于烟花算法的单目标优化问题求解及Matlab实现

    基于烟花算法的单目标优化问题求解及Matlab实现 烟花算法 Fireworks Algorithm 是一种新型的群智能算法 模拟了烟花爆炸时颜色花火 噪声花火等不同类别的行为特征 通过对爆炸位置 高度 数量等参数进行调整来求解单目标优化问
  • CRC校验流程

    通常我们在涉及到传输指令或者命令行的时候 为了保证数据传输的正确性和准确性 会涉及到校验码的问题 而我们通常会采用CRC校验 CRC是比较常用的对命令行和指令行的校验方法 一般会放在指令的后面 用以核对数据的正确性 其实如果是比较简单的指令
  • js使用mqtt的示例代码

    浏览器如果要使用mqtt 需要引用js包 基本使用 Create a client instance var options mqtt客户端的id 这里面应该还可以加上其他参数 具体看官方文档 clientId mqttjs Math ra
  • 数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • 数组转化为list

    1 Arrays asList strArray 方式 将数组转换List后 不能对List增删 只能查改 否 则抛异常 此时是java util Arrays ArrayList 这里面有java util Arrays里面的内部类 里面
  • [pycharm]添加环境变量

    1 问题描述 当import第三方库时 例如自己定义的rosmsg 可能会出现无法索引的情况 2 解决方案 2 1 方法1 在pycharm解释器里面添加路径 File gt Setting gt Project xxxx gt Pytho
  • java开发环境搭建参考网址整理【全】

    前言 大家每次换本儿是不是和我一样头疼需要重新把开发环境重新搭建一遍 我本人主要是通过百度参考别人的网址跟着搭建的 慢慢我就想为啥不专门写一篇文章整理一下从头至尾比较全面的步骤呢 这样方便自己 也方便大家哈 ps 以下有关的文章链接是参考优
  • python中dtypes_Dataframe创建及index,columns,values,dtypes等属性介绍

    DataFrame概念 可以通俗理解为excel中一片数据 表格型数据结构 带有标签的二维数组 有行标签 index 和列标签 columns 其值可以是数值 字符串 布尔值等 1 index 行标签 2 columns 列标签 3 val
  • Layui之动态选项卡&iframe使用

    目录 tab选项卡 方法层 实体类 User web层 登录界面代码 tab选项卡 我们顺着上篇的博客内容 在那个基础上加一个选项卡 首先我们打开Layui的在线文档 网址如下 Tab选项卡 在线演示 Layuihttp layui org
  • LeetCode之螺旋矩阵 II 简单易懂与晦涩难懂两种方法解决

    目录 题目 方法一 简单易懂 四方步步紧逼法 代码 方法二 复杂一点 上下法 代码 题目 给你一个正整数 n 生成一个包含 1 到 n2 所有元素 且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 示例 1 输入 n 3