力扣算法ing(69 / 100)
``
5.12 数组合集—59.螺旋矩阵
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
这道题目可以说在面试中出现频率较高的题目,本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。
我的思路:其实我最开始是没有思路的,除了一昧的循环,我没有任何思路,看到题解使用的边界方法,我突然领悟了
生成一个包含 1 到 n2 所有元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix
生成一个正方形的矩阵,它的值是元素按顺时针螺旋排列得到的
i j
00 01 02
10 11 12
20 21 22
定义边界
r=2 l=0 t=0 b=2
for(int i = 0 ; i < r ; i++){[top][i]top++
}
for(let j = top ; j < b ; j++){[j][r]r--;
}
for(let k = r ; k > l ; k-- ){[b][k]b--;
}
for(let m = b ; m > t ; m==){[m][l];l++
}
但是实现起来却没有这么简单:
-
矩阵声明问题:
我最开始是用的
-
let res : number[][] = [];
但是这样的声明不会创建一个n x n的二维数组,而是创建了一个空数组
-
let res = new Array(n).fill(0).map(() => new Array(n).fill(0));
最终代码:
function generateMatrix(n: number): number[][] {// 定义边界let r = n - 1 , l = 0 , t = 0 , b = n - 1;const total = n * n ; let num = 1 ; // 这样的声明不会创建一个n x n的二维数组,而是创建了一个空数组。let res = new Array(n).fill(0).map(() => new Array(n).fill(0));while(num <= total){for(let i = l ; i <= r ; i++){res[t][i] = num;num++;}t++;for(let j = t ; j <= b ; j++){res[j][r] = num;num++;}r--;for(let k = r ; k >= l ; k--){res[b][k] = num;num++;}b--;for(let m = b ; m >= t ; m--){res[m][l] = num;num++;}l++;}return res;};
总结:这样的螺旋问题可以使用边界法,边界是动态的,我们循环的时候注意一下边界就好啦