一、解题思路
这个题,很容易想到螺旋遍历数组,设置条件使螺旋数组转换方向。
此时容易出错,比如旋转时,忽略转一次过后上下左右界限的改变,思路:
1.首先明确规律
上左——上右;上右——右下;右下——下左;下左——上左;即为一圈;
2.确定界限定义
l,r,t,d;可以简单的确定以及表示四个方位界限,同时每转一次界限要改变,
比如左上——右上,相当于走完顶上第一行,t–;
3.代码实现
很容易想到从左到右是可以利用for循环对第一行数组元素赋值;以此内推
可以用四个for循环走完螺旋数组,同时for循环中 i 初始值以及范围都可根据界限设定;
class Solution {
public int[][] generateMatrix(int n) {
int [][] mat = new int [n][n];
// 直接定义四个边界,不用在条件里面限制,更加明确,以后写代码建议注意分离
// t变化规律0,1,...,向下变化,d向上变化,l向右变化,r向左变化
int t = 0; int d = n-1;
int l = 0; int r = n-1;
**// 定义数组值,并设置max计算出不要加在while中减少计算次数**
int num = 1; int max = n*n;
while(num <= max){
// 分四步利用for循环进行移动赋值,思路通俗易懂
// 1.向右移动
for(int i = l;i <= r;i++) mat[t][i] = num++;
// t++,已走完这一行,即t要加一向下移动一行,改变上方界限
t++;
// 2.向下移动
for(int i = t;i <= d;i++) mat[i][r] = num++;
//r减减改变右边界限,相当于走完这一条
r--;
// 3.向左移动
// i >= l,因为边界改变了要小于左边界不是简单的大于0
for(int i = r;i >= l;i--) mat[d][i] = num++;
// 走完下方这一条,改变下方界限
d--;
// 4.向上移动
// i>=t,以免走到已走过的一行
for(int i = d;i >= t; i--){
mat[i][l] = num++;
// 已走完左边这一条,改变左边界限,为下一次向右移动做铺垫
**// 注意此时使用for循环不要将改变界限的语句圈如,是for完执行改变界限语句**
}
l++;
}
return mat;
}
}