题目描述
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
解题思路
- 我们可以新建一个n*n的空矩阵,按照题目要求依次往进去添加数据;
- 分别定义矩阵的上下左右边界为 t , b , l , r ;
- 新建num初始化为1 每次添加后加1;
- 以3*3矩阵为例:首先需要在第一行从左到右填充1,2,3,因此此时的循环条件应该是:
for(int i = l; i <= r; i++) arr[t][i] = num++; t++;
- t++的目的是将上边界(蓝色的线)向下移动,以缩小矩阵范围;
- 接下来需要添加4,5,循环条件为:
for(int i = t; i <= b; i++) arr[i][r] = num++; r--;
- 绿色的右边界线向左移动,接下来填充6,7,循环条件是:
for(int i = r; i >= l; i--) arr[b][i] = num++; b--;
- 下边界线(红色的线)向上移动,接下来填充元素8,循环条件是:
for(int i = b; i >= t; i--) arr[i][l] = num++; l++;
- 左边界线(黄色的线)向右移动,至此一轮循环结束,最外层的一层元素已经填充完毕;
- 如果没有循环完将继续重复上面四个步骤,不断地调整四个边界线;
- 判断是否循环完成的条件是 num <= target,num 没有超过 target 说明元素还没有填充完毕。
输入输出示例
代码
class Solution {
public int[][] generateMatrix(int n) {
int num = 1, target = n*n;
int l = 0, r = n-1, t = 0, b = n-1;
int[][] arr = new int[n][n];
while(num <= target){
for(int i = l; i <= r; i++) arr[t][i] = num++;
t++;
for(int i = t; i <= b; i++) arr[i][r] = num++;
r--;
for(int i = r; i >= l; i--) arr[b][i] = num++;
b--;
for(int i = b; i >= t; i--) arr[i][l] = num++;
l++;
}
return arr;
}
}