今天刷螺旋矩阵II,大家有兴趣可以点上看看题目要求,试着做一下。
我们直接看题解吧:
(模拟法)思路:
1、定义t=0,b取n-1,l=0,r取n-1(即上下左右),初始值num=1,创建新数组mat,迭代终止值取num<=n*n
2、按照从左往右(t),从上到下(r),从右到左(b),从下到上(l)进行循环
a.依次累加并赋值
b.除第一行,其余行(列)均从该行(列)第二位元素开始
3.最终取得相应数组元素,并返回新数组mat
注:使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。
代码:
第一个循环比较多:
class Solution {
public int[][] generateMatrix(int n) {
int l = 0, r = n - 1, t = 0, b = n - 1;
int[][] mat = new int[n][n];
int num = 1, tar = n * n;
while(num <= tar){
for(int i = l; i <= r; i++) mat[t][i] = num++; // left to right.
t++;
for(int i = t; i <= b; i++) mat[i][r] = num++; // top to bottom.
r--;
for(int i = r; i >= l; i--) mat[b][i] = num++; // right to left.
b--;
for(int i = b; i >= t; i--) mat[i][l] = num++; // bottom to top.
l++;
}
return mat;
}
}
第二个比较难理解:
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int[] dx = {0, 1, 0, -1}, dy = {1, 0, -1, 0}; //方向偏移数组
int x = 0, y = 0; //当前位置
for(int i = 1, d = 0; i <= n*n; i++)
{
res[x][y] = i;
int a = x + dx[d], b = y + dy[d];
if(a <0 || a == n || b < 0 || b == n || res[a][b] != 0){//出界或该位置已被走过
d = (d + 1) % 4; //更改方向
a = x + dx[d] ;
b = y + dy[d]; //下一个要走的位置
}
x = a;
y = b;
}
return res;
}
}