原题描述
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
思路
创建二维矩阵,用变量记录遍历元素,顺时针将元素填充矩阵中。
解题方法
1. 初始化变量,确定遍历条件
//初始化变量
int[][] matrix = new int[n][n];
int x=0,y=0,h=matrix.length,w=matrix[0].length;
遍历的矩阵元素数量
int nums = 1;
//遍历条件
while (x<=w&&y<=h){
//顺时针填充数据
}
2. 遍历顶部第y行,由左向右
//up 遍历顶部第y行,由左向右
for (int i = x; i <w ; i++) {
matrix[y][i]=nums;
nums++;
}
//第y行已经遍历过
y++;
3. 遍历右边第w列,由上向下
//right 遍历右边第w列,由上向下
for (int i = y; i <h ; i++) {
matrix[i][w-1]=nums;
nums++;
}
//第w列已经遍历过
w--;
4.遍历底部h行, 由由向左
//down 遍历底部h行, 由由向左
for (int i = w-1; i >=x ; i--) {
matrix[h-1][i]=nums;
nums++;
}
//第h行已经遍历过
h--;
5. 遍历左边x行,由下向上
//left 遍历左边x行,由下向上
for (int i = h-1; i >=y ; i--) {
matrix[i][x]=nums;
nums++;
}
//第x列已经遍历过
x++;
复杂度
-
时间复杂度: O(n)
-
空间复杂度: O(n)
Code
class Solution {
public static int[][] generateMatrix(int n) {
//初始化变量
int[][] matrix = new int[n][n];
int x=0,y=0,h=matrix.length,w=matrix[0].length;
int nums = 1;
//遍历条件
while (x<=w&&y<=h){
//up 遍历顶部第y行,由左向右
for (int i = x; i <w ; i++) {
matrix[y][i]=nums;
nums++;
}
//第y行已经遍历过
y++;
//right 遍历右边第w列,由上向下
for (int i = y; i <h ; i++) {
matrix[i][w-1]=nums;
nums++;
}
//第w列已经遍历过
w--;
//down 遍历底部h行, 由由向左
for (int i = w-1; i >=x ; i--) {
matrix[h-1][i]=nums;
nums++;
}
//第h行已经遍历过
h--;
//left 遍历左边x行,由下向上
for (int i = h-1; i >=y ; i--) {
matrix[i][x]=nums;
nums++;
}
//第x列已经遍历过
x++;
}
return matrix;
}
}