题目描述:
标签:数组
给你一个正整数
n
,生成一个包含1
到n2
所有元素,且元素按顺时针顺序螺旋排列的n x n
正方形矩阵matrix
。
代码:
思路分析:
我本来想的是第几个数字可能和下标之间有数学表达式的对应关系,但是显然没有找到,就参考了一下精选解答,这个思路真的太巧妙了,是通过改变边界来插入数组真的太牛了!
1、设置左边界l=0、有边界r=n-1、上边界t=0、下边界b=n-1。
2、向二维数组插入数据分为以下四步得到螺旋矩阵:让 num 从 1——n*n 插入数据
①从左至右一行,即 l --> r,插入行不变列变的数据,即matrix[t][i]; 添加一行完成后要将上边界下移,即t++;
②从上至下一列,即 t --> b,插入列不变行变的数据,即matrix[i][r]; 添加一列完成后要将右边界左移,即r--;
③从右至左一行,即 r --> l,插入行不变列变的数据,即matrix[b][i]; 添加一行完成后要将下边界上移,即b--;
④从下至上一列,即 b --> t,插入列不变行变的数据,即matrix[i][l]; 添加一列完成后要将左边界右移,即l++;
class Solution {
public int[][] generateMatrix(int n) {
int[][] martix = new int[n][n];
int l = 0;//设置左边界
int r = n-1;//设置右边界
int t = 0;//设置上边界
int b = n - 1;//设置下边界
int num = 1;
int target = n * n;
while(num <= target){
for(int i = l;i <= r;i++){
martix[t][i] = num++;
}
t++;
for(int i = t;i <= b;i++){
martix[i][r] = num++;
}
r--;
for(int i = r;i >= l;i--){
martix[b][i] = num++;
}
b--;
for(int i = b;i >= t;i--){
martix[i][l] = num++;
}
l++;
}
return martix;
}
}