题目描述
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路
1.这道题的思路与54.螺旋矩阵类似,只不过将打印变成了赋值,我们可以设置一个count用于记录当前打印的进度,若达到了最大值则已经完成了赋值,将结果返回即可。
Java代码实现
public int[][] generateMatrix(int n) { int count = 1; int[][] res = new int[n][n]; int row = n-1; int col = n-1; int[] leftUp = new int[]{0,0}; int[] rightUp = new int[]{0,col}; int[] leftDown= new int[]{row,0}; int[] rightDown = new int[]{row,col}; while(count>0){ //从 左上 往 右上 变的是纵坐标 for (int i = leftUp[1]; i <= rightUp[1] && count<=n*n; i++) { res[leftUp[0]][i] = count; count++; } //左上 和 右上的横坐标+1 leftUp[0]++; rightUp[0]++; //从 右上 往 右下 变的是横坐标 for (int i = rightUp[0]; i <= rightDown[0] && count<=n*n; i++) { res[i][rightUp[1]] = count; count++; } //右上 和 右下的纵坐标 -1 rightUp[1]--; rightDown[1]--; //从 右下 往 左下 变的是纵坐标 for (int i = rightDown[1]; i >= leftDown[1]&& count<=n*n; i--) { res[leftDown[0]][i] = count; count++; } //右下 和 左下的 横坐标 -1 rightDown[0]--; leftDown[0]--; //从 左下 往 左上 变的是横坐标 for (int i = leftDown[0]; i >=leftUp[0] && count<=n*n; i--) { res[i][leftDown[1]] = count; count++; } //左下 和 左上的 纵坐标 +1 leftDown[1]++; leftUp[1]++; } return res; }