59. 螺旋矩阵 II
https://leetcode.cn/problems/spiral-matrix-ii/
方法一
- 模拟过程:向右 向下 向左 向上
- 每个方向的操作都不一样,需要有一个变量控制方向
- 每个方向的边界是动态的,所以处理完 行/列 的时候要更新边界值
- 向右结束 上边界缩小 up++
- 向下结束 右边界缩小 right–
- 向左结束 下边界缩小 down–
- 向上结束 左边界缩小 left++
class Solution {
public int[][] generateMatrix(int n) {
// 向右 j++
// 向下 i++
// 向左 j--
// 向上 i--
int current = 1; // 当前要填的数
int left = 0; // 左边界
int right = n-1; // 右边界
int up = 0; // 上边界
int down = n-1; // 下边界
int row = 0;
int column = 0;
int direction = 0; // 0 1 2 3 右 下 左 上
int[][] result = new int[n][n];
while(current<=n*n){
// 右 n========
// 起点 left 终点 right
if(direction ==0){
if(column<=right){
result[row][column] = current;
column++;
current++;
continue;
}else{
// 一行结束 缩小边界 重置索引
up++;
column--;
direction = 1;
row = up;
}
}
// 下 n-1===============
// 起点 up 终点 down
if(direction == 1){
if(row<=down){
result[row][column] = current;
row++;
current++;
continue;
}
if(row>down){
// 一列结束 缩小右边界
right--;
row--;
direction = 2;
column = right;
}
}
if(direction == 2 ){
// 左 n-1==========
if(column>=left){
result[row][column] = current;
column--;
current++;
continue;
}
if(column<left){
down--;
column++;
direction = 3;
row = down;
}
}
if(direction == 3){
// 上 n-2
if(row>=up){
result[row][column] = current;
row--;
current++;
continue;
}
if(row<up){
left++;
row++;
direction = 0;
column = left;
}
}
}
return result;
}
}