给你一个正整数 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) {
int [][] order = new int[n][n];
//边界
int left =0;
int right=n-1;
int top=0;
int bottom=n-1;
//方向
int cur_d=0; //0右 1下 2左 3上
int [][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; //移动方向对应的数据加减
//目前位置下标
int x=0,y=0; //x为纵 y为横
//arr数组存放标记 以及计数
int i=0;
while(i!=n*n){ // ←这里有变化
order[x][y]=i+1; //赋值也有了点小改变
i++;
if(cur_d==0 && y==right){ //到达右边界
cur_d++;
top++;
}else if(cur_d==1 && x==bottom){ //到达下边界
cur_d++;
right--;
}else if(cur_d==2 && y==left){ //到达左边界
cur_d++;
bottom--;
}else if(cur_d==3 && x==top){ //到达上边界
cur_d++;
left++;
}
cur_d %=4;
x+=dirs[cur_d][0];
y+=dirs[cur_d][1];
}
return order;
}
}
今天也学习了第二种思路,就是遇到非零的数时转向,这种方法的代码会简洁许多,转向标准为 cur_d = (cur_d + 1) % 4;
下附代码
class Solution {
public int[][] generateMatrix(int n) {
int [][] order = new int[n][n];
//方向
int cur_d=0; //0右 1下 2左 3上
int [][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; //移动方向对应的数据加减
//目前位置下标
int x=0,y=0; //x为纵 y为横
//arr数组存放标记
int i=0;
while(i!=n*n){
order[x][y]=i+1;
i++;
//用来判断是否遇到非零的数
int dx=dirs[cur_d][0];
int dy=dirs[cur_d][1];
int newx=x+dx;
int newy=y+dy;
//如果遇到非0的数就转向
if(newx<0 || newx>=n ||newy<0 || newy>=n || order[newx][newy]!=0){
cur_d = (cur_d + 1) % 4;
dx=dirs[cur_d][0];
dy=dirs[cur_d][1];
}
x+=dx;
y+=dy;
}
return order;
}
}
此文章创于本人学习时的记录,如有错误或更优解还请指出