59. 螺旋矩阵 II
题目描述
给定一个正整数 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;
}

