题目
题目来源leetcode
leetcode地址:59. 螺旋矩阵 II,难度:中等。
题目描述(摘自leetcode):
给你一个正整数 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
本地调试代码:
class Solution { //业务代码 public int[][] generateMatrix(int n) { ... } public static void main(String[] args) { int n = 4;//设置边长度 printMatrix(n); } public static void printMatrix(int n){ Solution solution = new Solution(); int m = n * n; int numLen = 0; while (m > 0) { m = m / 10; numLen++; } numLen += 2;//每个数字之间空两个 int[][] ints = solution.generateMatrix(n); for (int i = 0; i < ints.length; i++) { for (int j = 0; j < ints[i].length; j++) { System.out.printf("%-" + numLen + "d", ints[i][j]); //numLen表示长度,-表示左对齐。例如:%-4d => 宽度为4,左对齐 } System.out.println(); } } }
题解
这是一道逻辑题,花费了我一个多小时解出来,关键就是需要你找到其中的规律!
思路:
刚开始实在没有头绪,就去看了大佬的一个题解思路,看到下面这张图之后就开始撸代码了,我觉得最核心的就是下面这个图,其他主要就是你要找一些规律,例如有边长n对应有多少圈;在哪一圈上下左右每次需要填充的数量;最里边填充一个数字的情况…
图片取自:代码随想录—螺旋矩阵
代码:
public int[][] generateMatrix(int n) { int[][] matrixArr = new int[n][n]; if (n == 1) { matrixArr[0][0] = 1; return matrixArr; } //填充的数 int num = 1; //圈数 int outCircleNums = n % 2 == 1 ? n / 2 + 1 : n / 2; //每层(上下左右)要填充的对应数量。例如上图3*3,上下左右方向都要填充2个 int curTire = 0; //圈数遍历 for (int i = 0; i < outCircleNums; i++) { //求每层(上下左右)要填充的对应数量 if (i == 0) { curTire = n - 1;//最外圈只要-1即可 } else { curTire = curTire - 2;//里面的每一圈都要-2 } //最内圈只有一个数的情况 if (i == outCircleNums - 1 && n % 2 == 1) { matrixArr[i][i] = num; break; } //绘制正方形上层 for (int j = i; j < i + curTire; j++) { matrixArr[i][j] = num++; } //绘制正方形右边 for (int j = i; j < i + curTire; j++) { matrixArr[j][curTire + i] = num++; } //绘制正方形下边 for (int j = i + curTire; j > i; j--) { matrixArr[curTire + i][j] = num++; } //绘制正方形左边 for (int j = i + curTire; j > i; j--) { matrixArr[j][i] = num++; } } return matrixArr; }
本地调试效果图: