(一)问题描述
leetcode题目链接. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/spiral-matrix-ii/ 给你一个正整数 n
,生成一个包含 1
到 n的平方的
所有元素,且元素按顺时针顺序螺旋排列的 n×n
正方形矩阵 matrix
。
示例1:
输入:n=3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例2:
输入:n=1
输出:[[1]]
提示:1<=n<=20
(二)解题思路
这道题没有用到复杂的算法,就是对整个数组螺旋的过程进行模拟:螺旋一圈有四条边需要填充,分别填充这四条边就可以了。
这里正方形矩阵要填充的圈数,n为偶数时是n/2, n为奇数时是n/2+1。判断方式:想象把矩阵横着从中间切一刀,一半里有几行就是填几圈。对于n为奇数的矩阵,最后一圈就是中心的那一个元素,所以最后单独判断一下n的奇偶,奇数就单独填充一下中间的元素。
伪代码:
generateMatrix (n)
//顺时针螺旋填充正方形矩阵
//输入:正方形矩阵的边长n
//输出:填充后的正方形矩阵result
int val←0, k←0 // val代表当前填充的值,k代表当前填充的是第几圈
int startx, starty //当前圈的起始坐标
int i,j //当前填充元素的坐标,默认i是行坐标,j是列坐标
int result[][] //结果二维数组
while k<=n/2
for j=starty; j<n-k; j++ //填充当前圈的上边
result [i][j] =val++
for i=startx; i<n-k; i++ //填充当前圈的右边
result [i][j] =val++
for j=n-k; j>starty; j-- //填充当前圈的下边
result [i][j] =val++
for i=startx; i>startx; i++ //填充当前圈的左边
result [i][j] =val++
k++ //这圈结束了,更新圈数
startx++ //更新下一圈的起始位置
starty++
if n%2!=0
result[n/2][n/2]=n*n
return result
(三)易错点
1. 控制循环不变量。每条边对于端点的处理规则应当一致。第一条边处理时需要包含起始点,那么之后每一条边都需要包含起始点,因此每一条边不应该包含终点(即下一条边的起始点,不然下一条边的处理就不能包含起始点了,每次循环的条件就没法保持一致了)。
2. startx和starty等于k-1,而不是k。
3. 在Java中,n^2不等于n*n。n^2表示异或运算,不是平方。表示平方可以用n*n,或Math.pow(n,2).
2. 不是所有问题都有对应的算法,有可能实际写出来的代码就是比较长,要敢写。这道题就没有对应的算法,只是对顺时针螺旋的过程进行模拟。while循环里要包含4个for循环来填充四条边。我一开始想到了这样写,但觉得不可能是这种笨解法,肯定有简便方法,最后就没有这样写。