题目描述
给定一个正整数,生成一个包含到所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
相关话题: 数组 难度: 中等
示例
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路:
和螺旋打印二位数组思路一样,采用一种宏观的思想逐层螺旋式地给二维数组赋值,
- 首先,矩阵左上角的位置
tr
和tc
,右下角位置br
和bc
。 - 核心思想是通过顺时针的方式逐层赋值,依次为
-
tr
不变,i : tc -> bc - 1
,做循环for(int i = tc;i <= bc - 1;i++)
-
bc
不变,i : tr -> br - 1
,做循环for(int i = tr;i <= br - 1;i++)
-
br
不变,i : bc -> tc + 1
,做循环for(int i = bc;i >= tc + 1;i--)
-
tc
不变,i : br -> tr + 1
,做循环for(int i = br;i >= tr + 1;i--)
-
以上四个循环做完,就给一层赋了值,然后tr++,tc++,br--,bc--
,给内一层赋值,直到tr <= br
。
需要注意的一个边界条件tr==br
,当n为奇数时
最后中间只剩一个元素需要赋值,此时
tr==br, tc == bc
,以上四个循环都无法进入,所以要对tr == br
做边界处理。
class Solution {
public int[][] generateMatrix(int n) {
int tr = 0, tc = 0;
int br = n - 1, bc = n - 1;
int[][] matrix = new int[n][n];
int count = 0;
while(tr <= br){
if(tr == br){
matrix[tr][tc] = ++count;
}else{
for(int i = tc;i <= bc - 1;i++){
matrix[tr][i] = ++count;
}
for(int i = tr;i <= br - 1;i++){
matrix[i][bc] = ++count;
}
for(int i = bc;i >= tc + 1;i--){
matrix[br][i] = ++count;
}
for(int i = br;i >= tr + 1;i--){
matrix[i][tc] = ++count;
}
}
tr++;
tc++;
br--;
bc--;
}
return matrix;
}
}