59. 螺旋矩阵 II
模拟法就是模拟数字填写的轨道,像一辆火车慢慢的行驶在设定的螺旋轨道上面
left、right、top、bottom就是起到约束作用的轨道
过程:
一
for (int i = left; i <=right ; i++) result[top][i]=num++;
top++;
- 这一段是从left到right的轨道
从left向right方向行驶 (沿top=0这行轨道)
行驶到边界的时候停车
top方向向下移动一行
二
for (int i = top; i <=bottom ; i++) result[i][right]=num++;
right--;
这一段是从top到bottom的轨道
沿着right=2方向向下行驶
由一可知列车已经经过了3这个格子,应该从4格开始行进
而由一中top方向向下移动一行即top++的操作,已经完美的把列列车的起始位置摆到了4格
right方向向左移动一行
三
for (int i = right; i >=left ; i--) result[bottom][i]=num++;
bottom--;
这一段是从right到left的轨迹
沿着bottom=2的轨迹向左行驶
同理,起始位置为6格子,同样是由二中**right–**的操作做铺垫
行驶完成之后
bottom方向向上移动一行
四
for (int i = bottom; i >=top ; i--) result[i][left]=num++;
left++;
这一段是从bottom到top的轨道
从bottom向top方向行驶 (沿left=0这行轨道)
只行驶了8这一个格子
经过这四次轨道行驶之后
top=1,bottom=1,left=1,right=1
而由于num<=max(9<=9)说明最后一个中间的数字还没有添加上
则最后
for (int i = left; i <=right ; i++) result[top][i]=num++;
top++;
将nums[1][1](既是中间的数字)进行添加
之后的 top++、right–、bottom–、left++操作
使得for循环不能进入,最后由while (num<=max)跳出循环
得到result
public int[][] generateMatrix(int n) {
int result[][]=new int[n][n];
int left=0,right=n-1,top=0,bottom=n-1;
int num=1,max=n*n;
while (num<=max){
for (int i = left; i <=right ; i++) result[top][i]=num++;
top++;
for (int i = top; i <=bottom ; i++) result[i][right]=num++;
right--;
for (int i = right; i >=left ; i--) result[bottom][i]=num++;
bottom--;
for (int i = bottom; i >=top ; i--) result[i][left]=num++;
left++;
}
return result;
}
#算法刷题与整理