首页 > 其他分享 >螺旋矩阵 II

螺旋矩阵 II

时间:2022-09-02 14:59:33浏览次数:88  
标签:count 螺旋 res res1 矩阵 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])
   }
   
}

标签:count,螺旋,res,res1,矩阵,II,右开,左闭
From: https://www.cnblogs.com/suehoo/p/16649850.html

相关文章

  • 矩阵运算常用性质
    以下内容是把这里的结论整理了一下。矩阵乘法已知\(\mathbf{C}=\mathbf{A}\mathbf{B}\),则:\[\mathbf{C}^T=\mathbf{B}^T\mathbf{A}^T\]已知\(\mathbf{C}=\mathbf{......
  • 113.path-sum-ii 路径总和 II
    #include<vector>usingstd::vector;classSolution{private:voidget_sum(TreeNode*root,vector<int>path,intsum,vector<vector<int>>&res,inttarg......
  • Geopandas III (Kafka-Stream)
    GeopandasIII(Kafka-Stream)大家好,在本文中,我们将使用geopandas和matplotlib以及来自kafka的数据制作如下实时地图。文章中使用的代码和数据关联您可以通过访......
  • IIC协议介绍
    讲解I2C协议之前,首先列出GPIO的输出模式配置图,输出模式有推挽输出、开漏输出。推挽输出:可以输出高、低电平,连接数字器件。推挽结果一般是指两个三极管分别受两互补信号的......
  • 在博客园的博客文章中自动播放 asciinema
    需求我的文章中都是用Markdown写的,所以嵌入的asciinema只能通过Embedimagelink的方式,这就导致打开文章页面后只有一个asciinema的预览图,点击图片后会跳转到asc......
  • [Google] LeetCode 552 Student Attendance Record II
    Anattendancerecordforastudentcanberepresentedasastringwhereeachcharactersignifieswhetherthestudentwasabsent,late,orpresentonthatday.......
  • 算法 - 螺旋矩阵 II
    59.螺旋矩阵II这道题困扰了我很久,一些边界值控制比较繁琐,但是偶然发现按照以下方法写,在Leetcode可以AC。classSolution{publicstaticint[][]generateMatrix(......
  • SP1557 GSS2 - Can you answer these queries II
    SP1557GSS2-CanyouanswerthesequeriesII题目大意给出\(n\)个数,\(q\)次询问,求最大子段和,相同的数只算一次。分析看到一个区间内相同的数只能算一次,经验告诉......
  • 了解拉普拉斯矩阵的工作原理第 2 部分
    了解拉普拉斯矩阵的工作原理第2部分Photoby马里奥拉·格罗贝尔斯卡on不飞溅与拉普拉斯矩阵相关的格和的渐近评估(arXiv)作者:阿尔祖博伊萨尔,法提赫·埃......
  • 768. 最多能完成排序的块 II
    题目(链接)arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们......