题目描述:
给定一个正整数 n,生成一个包含 1 到 n 2所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
题目难度:中等
分析:
和前面的54.螺旋矩阵I同样的道理,还是模拟路径,首先绘制出一个n*n的矩阵,然后顺时针按照从左到右,从上到下,从右到左,从下到上的方向依次去走,然后把每次应该填入的数字填入即可。代码如下:
java:
class Solution { public int[][] generateMatrix(int n) { // 定义一个二维数组 int[][] res = new int[n][n]; // 数字从1开始,最大值也就是方格数 int currentNum = 1, maxNum = n * n; // 定义边界,边界就是下标的最大值,用来控制方向,转弯 // 首先是左边,按照顺时针理解,从左到右为正方向,所以初始值是0 // 从右到左就是反方向,所以右边界是n - 1,上下边界同理 int left = 0, top = 0, right = n - 1, back = n - 1; while (currentNum <= maxNum) { // 从左到右 for (int i = left; i <= right; i++) { // 填入的值按照二维数组的下标表示的话依次是[0][0],[0][1],[0][2]... // 由此可见上边界top是不变的 res[top][i] = currentNum++; } // 走完一次top,那么top边界应该改变,顺时针就是+1 top++; // 另外3条边同理,以此类推即可 for (int i = top; i <= back; i++) { res[i][right] = currentNum++; } right--; for (int i = right; i >= left; i--) { res[back][i] = currentNum++; } back--; for (int i = back; i >= top; i--) { res[i][left] = currentNum++; } left++; } return res; } }
python:
要注意二维数组的创建方式,不能用res = [[0] * n] * n这种方式。否则当 [0][0]改变,[1][0]也会改变。
class Solution: def generateMatrix(self, n: int) -> List[List[int]]: res = [[0] * n for i in range(n)] current_num, max_num = 1, n * n left, top, right, back = 0, 0, n - 1, n - 1 while current_num <= max_num: for i in range(left, right + 1): res[top][i] = current_num current_num += 1 top += 1 for i in range(top, back + 1): res[i][right] = current_num current_num += 1 right -= 1 for i in range(right, left - 1, -1): res[back][i] = current_num current_num += 1 back -= 1 for i in range(back, top - 1, -1): res[i][left] = current_num current_num += 1 left += 1 return res
总结:
时间复杂度为O(n 2 ),此方法是54.螺旋矩阵I的改良方法,不需要去判断当前方向,较为简单,多看几遍即可理解。