当前位置: 首页 > news >正文

59.螺旋矩阵II

力扣题目链接(opens new window)

代码随想录

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

示例:

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

其实这道题我是完全没有思路的

思路

这道题目可以说在面试中出现频率较高的题目,本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。

要如何画出这个螺旋排列的正方形矩阵呢?

相信很多同学刚开始做这种题目的时候,上来就是一波判断猛如虎。

结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里那里有问题,改了那里这里又跑不起来了。

大家还记得我们在这篇文章数组:每次遇到二分法,都是一看就会,一写就废 (opens new window)中讲解了二分法,提到如果要写出正确的二分法一定要坚持循环不变量原则

而求解本题依然是要坚持循环不变量原则。

模拟顺时针画矩阵的过程:

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

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

可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是一进循环深似海,从此offer是路人

这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。

那么我按照左闭右开的原则,来画一圈,大家看一下:

这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。

这也是坚持了每条边左闭右开的原则。

一些同学做这道题目之所以一直写不好,代码越写越乱。

就是因为在画每一条边的时候,一会左开右闭,一会左闭右闭,一会又来左闭右开,岂能不乱。

代码如下,已经详细注释了每一步的目的,可以看出while循环里判断的情况是很多的,代码里处理的原则也是统一的左闭右开。

其实最主要的就是认准每个边间的处理条件,就是左闭右开,在每个角落的值都由下一条边去处理。

class Solution {public int[][] generateMatrix(int n) {int[][] nums = new int[n][n];int startx=0,starty=0;//起始的坐标int i,j;int offset=1;//用来处理边界条件的int count=1;int m=1;//用来记录当前的圈数while(m<=n/2){//处理第一圈的第一行,这一行不能处理最后一个元素for(j=starty;j<n-offset;j++){nums[startx][j] = count++; }//处理第一圈的最后边那一列,此时j为3for(i=startx;i<n-offset;i++){nums[i][j] = count++;}//处理第一圈的最下面的一行,此时i变为了3,然后其实要处理jfor(;j>starty;j--){nums[i][j] = count++;}//处理最左边的一列,此时i=3,j=0;for(;i>startx;i--){nums[i][j] = count++;}startx++;starty++;offset++;m++;}//如果 n是奇数的话那么转完圈后就还剩最后一个元素没有赋值if(n%2 == 1){nums[startx][starty] = count;}return nums;}
}

http://www.dtcms.com/a/319109.html

相关文章:

  • 恒虚警检测(CFAR)仿真:杂波边缘与多目标场景分析
  • 目标检测数据集 - 疟疾检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 微算法科技(NASDAQ:MLGO)利用集成学习方法,实现更低成本、更稳健的区块链虚拟货币交易价格预测
  • RocketMQ概览
  • Kotlin中String的==相等比较符
  • STM32HAL 快速入门(一):点灯前的准备 —— 从软件安装到硬件原理
  • 利用微软SQL Server数据库管理员(SA)口令为空的攻击活动猖獗
  • 思途spring学习0807
  • Java -- Arrays类-- System类-- BigInteger和BigDecimal类
  • 串口通信02 温度传感DS18B20 01 day49
  • jetson上使用opencv的gstreamer进行MIPI和USB摄像头的连接以及udp推流
  • JAVA,Maven分模块设计
  • 语言模型(LM):n-gram模型原理与困惑度(Perplexity)计算详解
  • B-树与B+树
  • AI大模型专题:LLM大模型(初识)
  • dubbo的metadata-report是做啥的
  • 17.11 单卡24G显存微调GLM-4实战:QLoRA到全参数调优,准确率狂飙42.7%
  • Qt: WA_DontCreateNativeAncestors
  • 【缩点 拓扑序】P3119 [USACO15JAN] Grass Cownoisseur G|省选-
  • 【关于Java中==和equals( )和hashCode( )三者异同】
  • 写Rust GPU内核驱动:GPU驱动工作原理简述
  • 【性能测试】---测试工具篇
  • 医疗人效管理新标杆:盖雅工场如何赋能健康服务企业提质增效
  • 「iOS」————自动释放池底层原理
  • CSS包含块与百分比取值机制完全指南
  • 数据分析——Pandas库
  • 添加内容溢出时显示完整内容提示的功能
  • QT5.15 mingw
  • c++之 栈浅析
  • Python 数据类型及数据类型转换