59. 螺旋矩阵 II
刚开始遇到这道题目的时候相信没见过的同学多多少少都会有点懵圈,感觉题目有点无从下手,但其实只要抓住本质就行了,题目的最终目的就是返回一个二维数组的结果,这个二维数组的大小是的 int[n][n]
,题目给出了 n = 3 时的输出结果:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
那其实我们要做的就是将矩阵中的每一个单元格的内容填充进这个二维数组中,至于填充的过程是怎样的,就需要我们去找出规律,然后用代码去模拟这个旋转过程了,可见这是一道过程模拟的编程题。
以 n == 4,有规律如下:
不难发现,n = 4 的情况下,旋转了两圈。n = 3 的情况下,旋转了一圈,外加一个中心坐标。于是模拟顺时针矩阵的过程可以这样:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
那么我按照左闭右开的原则,来画一圈,大家看一下:
Java 代码如下:
class Solution {public int[][] generateMatrix(int n) {int[][] result = new int[n][n];int loop = n / 2; // 螺旋圈数int mid = n / 2; // 中心坐标,eg:n==3的中心坐标是[1,1]int num = 1; // 螺旋排序从1开始int startx = 0; // 起点x坐标int starty = 0; // 起点y坐标int offset = 1; // 偏移量int i, j; // 作为每次循环的起始坐标while(loop-- > 0) {// 模拟填充上行过程(左闭右开)for(j = starty; j < n - offset; j++) {result[startx][j] = num++;}// 模拟填充右列过程(上闭下开)for(i = startx; i < n - offset; i++) {result[i][j] = num++;}// 模拟填充下行过程(右闭左开)for(; j > starty; j--) {result[i][j] = num++;}// 模拟填充左列过程(下闭上开)for(; i > startx; i--) {result[i][j] = num++;}// 更新坐标startx++;starty++;// 更新偏移量offset += 1;}// 如果是奇数,中心坐标需要单独处理if(n % 2 == 1) {result[mid][mid] = num++;}return result;}
}