给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
题解:
- 尝试过用数学公式推导[row][col]的值,没推出来
- 只能用“真-螺旋”方法生成了,最外层循环次数是固定的,n^2次,且生成数也是从1 到 n^2,故生产数也可以作为循环控制变量
- 同上次螺旋矩阵I,从外层到内层依次访问,设置deep = 层深度,默认最外层deep=0层从 [0][0] 开始到 [1][0]结束,deep++,deep=1层从[1][1] 开始到 [2][1]结束,deep++,deep=3等以此类推.....可用n和deep很方便设置每次遍历范围
- 每层循环,先执行向右 j++,然后向下i++,再向左 j--,最后向上 i--,注意结尾位置并非起点,而且为了避免折返录入(见螺旋矩阵 I 3问题二),在向下、向左、向上时候要检测cnt是否应该结束循环
class Solution {
public int[][] generateMatrix(int n) {
int[][] ret = new int[n][n];
//cnt = 当前存放数 deep = 层数,从0开始递增
int x=0, y=0 ,cnt=1 ,deep = 0;
while(cnt <= n*n){
int i=deep , j=deep;
for( ; j<n-deep ; j++,cnt++){
ret[i][j] = cnt;
}
for( i+=1,j-=1 ; i<n-deep && cnt<=n*n ; i++,cnt++){
ret[i][j] = cnt;
}
for( j=n-2-deep,i-=1 ; j>=deep && cnt<=n*n ; j--,cnt++){
ret[i][j] = cnt;
}
for( i=n-2-deep,j+=1 ; i>deep && cnt<=n*n ; i--,cnt++){
ret[i][j] = cnt;
}
deep++;
}
return ret;
}
}