螺旋矩阵 II

螺旋矩阵 II#

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

思路#

为了利于录友们理解,我特意录制了视频,拿下螺旋矩阵!LeetCode:59.螺旋矩阵II (opens new window),结合视频一起看,事半功倍!

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

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

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

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

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

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

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

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

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

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

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

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

螺旋矩阵

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

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

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

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

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

package main

func generateMatrix(n int) [][]int {

   startx,starty:=0,0
   mid:=n/2
   count:=1
   offset:=1
   i,j:=0,0
   res := make([][]int, n)
   for i:=range res{
      res[i]=make([]int,n)
   }
   for loop:=n/2;loop>0;loop--{
      i=startx
      j=starty
      for j=starty;j<n-offset;j++{
         res[startx][j]=count
         count+=1

      }
      for i=startx;i<n-offset;i++{
         res[i][j]=count
         count++
      }
      for ;j>starty;j--{
         res[i][j]=count
         count++
      }
      for ;i>startx;i--{
         res[i][j]=count
         count++
      }
      startx++
      starty++
      offset++
   }
   if n%2 !=0{
      res[mid][mid]=count
   }
   return res



}

func main()  {
   res1 := make([][]int, 3)
   res1 =generateMatrix(3)
   for i:=range res1{
      println(res1[i][0],res1[i][1],res1[i][2])
   }
   
}

作者:suehoo

出处:https://www.cnblogs.com/suehoo/p/16649850.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   suehoo  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu