螺旋矩阵 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