LeetCode-59. 螺旋矩阵 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上有几道题目是与本题相似题型的,可以参考:54. 螺旋矩阵 + 蛇形矩阵打印 + 螺旋矩阵,剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题。
- 看完本题的题目后,我们可以知道的是,螺旋矩阵在某个时刻会转变遍历的方向,而且方向只有四种。
- 那螺旋矩阵什么时候才会转换遍历方向呢?这是解决本题的核心,也是决定着能够顺利求解本题。
- 值得注意的是,每当在一个方向遍历时,如果遇到了越界了的情况,那就说明了需要进行转换方向了。
- 此外,我们仔细观察一下8和1这两个数字,当遍历到8时,其实还没遇到边界,方向还是改变了。那是什么原因导致方向改变呢?答案就是遇到重复遍历的格子!我们在这里可以设置一个isTravel的布尔矩阵来标识某个坐标是否已经遍历了。
- 综上,我们就可以写出本题的代码了,具体的实现还是很简单的。
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int tot = n * n;
boolean[][] isTravel = new boolean[n][n];
int di = 0, dj = 0;
res[0][0] = 1;
isTravel[0][0] = true;
int curdir = 0;
for(int i=1; i<tot; i++){
int x = di + dir[curdir][0];
int y = dj + dir[curdir][1];
if(x < 0 || y < 0 || x >= n || y >= n || isTravel[x][y]){
curdir = (curdir + 1) % 4;
}
di = di + dir[curdir][0];
dj = dj + dir[curdir][1];
isTravel[di][dj] = true;
res[di][dj] = i + 1;
}
return res;
}
}
结果展示
Either Excellent or Rusty