1. question: 螺旋数组II(中等)
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/spiral-matrix-ii
示例 1:
1 | 输入:n = 3 |
示例 2:
1 | 输入:n = 1 |
提示:
1 | 1 <= n <= 20 |
2. answers
这道题没什么思路,直接参考博客的答案。不要被螺旋的思路限制住。
首先我们求解的数组,也就是N*N的数组,因为螺旋可以看成是宏观上的外圈到内圈,所以我们可以模拟螺旋由外到内填充数组。
- 一圈可分成四个方向,并且方向是按照数值逐步增大的。四个方向依次是:左——>右;上——>下;右——>左;下——>上。可按照四个方向分别填充。
- 为了方便,将四个方向分别划分成等量的元素。如上图中的1,2;3,4;5,6;7,8。那么每边的元素个数怎么确定呢?可归纳一下,最外圈一定就是N-1;内一圈,因为圈存在两边,所以内一圈的一边就比外圈少2。
- 每个方向的尾元素和下个方向的首元素在数组下标(x,y)是有关系的,要么x+1,要么y+1。或者减一。
因此,经过上述步骤,可填充一圈。那么如何确定有圈数s呢?
因为,一圈是有两侧的,若干个圈的两侧(类似树的年轮)共同组成了横截面,也就是N。因此如果N是偶数,则圈数就是除2;如果是奇数,则最内圈,实际上就是一个元素,1+2s=N,相当于对2取整。至于最内的元素,可单独赋值。
此时,还需要确定的一点是:相邻两圈的关系,显然每圈都被分为四个方向边,且都是依照上面顺序来填充的,显然外圈的尾元素(最后一条边的尾元素)和内圈的首元素是相邻的,即x1 = x0, y1 = y0+1。
代码如下所示(注意,循环时的退出已经满足了,所以上面四条边的首尾元素的下标关系要重新判断。):
1 | public class Solution_0057 { |
仔细分析上面的代码,可以看到,其实每圈循环的时候,除了最开始的下标更新,后面三个方向的下标实际上是一样的(因为每个方向的循环退出时,刚好是下一个方向的首元素),所以没必要设置那么多的变量。
3. 备注
参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com),代码随想录 (programmercarl.com)。