宝山区建设用地事务所网站,asp.net个人网站模板,博山网站seo,腾讯云服务器可以做传奇网站吗螺旋矩阵
题目
给你一个正整数 n #xff0c;生成一个包含 1 到 n2 所有元素#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1#xff1a; 输入#xff1a;n 3
输出#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2#xff1a;
输入#xff…螺旋矩阵
题目
给你一个正整数 n 生成一个包含 1 到 n2 所有元素且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1 输入n 3
输出[[1,2,3],[8,9,4],[7,6,5]]示例 2
输入n 1
输出[[1]]按层模拟解题思路
这段代码是一个生成螺旋矩阵的算法。它使用一个二维数组matrix来表示n行n列的矩阵通过循环来逐步填充矩阵中的元素。
首先定义四个变量left、right、top和bottom分别表示当前螺旋矩阵的左边界、右边界、上边界和下边界。另外还有一个变量num用于记录当前要填充的数字。然后通过一个while循环来依次填充矩阵中的元素。循环条件是num小于等于n*n也就是还没有填充完所有的元素。在循环中: 首先从左到右填充上边界即从left到right-1将数字num依次赋值给matrix[top][i]同时num递增。将top递增表示上边界向下移动一行。然后从上到下填充右边界即从top到bottom-1将数字num依次赋值给matrix[i][right]同时num递增。将right递减表示右边界向左移动一列。然后从右到左填充下边界即从right到left1将数字num依次赋值给matrix[bottom][i]同时num递增。将bottom递减表示下边界向上移动一行。最后从下到上填充左边界即从bottom到top1将数字num依次赋值给matrix[i][left]同时num递增。将left递增表示左边界向右移动一列。循环回到开始直到所有的元素都被填充完。 最后返回生成的螺旋矩阵matrix。
代码
/*** param {number} n* return {number[][]}*/
var generateMatrix function(n) {let matrix [];for (let i 0; i n; i) {matrix.push([]);}let left 0, right n - 1, top 0, bottom n - 1;let num 1;while (num n*n) {for (let i left; i right; i) matrix[top][i] num;top;for (let i top; i bottom; i) matrix[i][right] num;right--;for (let i right; i left; i--) matrix[bottom][i] num;bottom--;for (let i bottom; i top; i--) matrix[i][left] num;left;}console.log(matrix);return matrix;
};模拟法解题思路
这段代码是用JavaScript编写的生成螺旋矩阵的函数。它使用一个二维数组matrix来表示n行n列的矩阵通过循环逐步填充矩阵中的元素。
首先定义了一些变量。maxNum表示最大的数字也就是矩阵中元素的个数curNum表示当前要填充的数字matrix是一个大小为n x n的二维数组初始值都为0row和column表示当前要填充的位置directions是一个数组表示四个方向的偏移量分别是右、下、左、上directionIndex表示当前的方向。然后通过一个while循环来依次填充矩阵中的元素。循环条件是curNum小于等于maxNum也就是还没有填充完所有的元素。在循环中 首先将当前位置的值设置为curNum然后curNum递增。接着计算下一个位置的行号和列号即nextRow row directions[directionIndex][0]和nextColumn column directions[directionIndex][1]。如果下一个位置超出了矩阵的边界或者已经有值了即不为0则说明需要改变方向。这里通过directionIndex (directionIndex 1) % 4来顺时针旋转到下一个方向。最后更新row和column的值为下一个位置的行号和列号进入下一次循环。 最终返回生成的螺旋矩阵matrix。
代码
var generateMatrix function(n) {const maxNum n * n;let curNum 1;const matrix new Array(n).fill(0).map(() new Array(n).fill(0));let row 0, column 0;const directions [[0, 1], [1, 0], [0, -1], [-1, 0]]; // 右下左上let directionIndex 0;while (curNum maxNum) {matrix[row][column] curNum;curNum;const nextRow row directions[directionIndex][0], nextColumn column directions[directionIndex][1];if (nextRow 0 || nextRow n || nextColumn 0 || nextColumn n || matrix[nextRow][nextColumn] ! 0) {directionIndex (directionIndex 1) % 4; // 顺时针旋转至下一个方向}row row directions[directionIndex][0];column column directions[directionIndex][1];}return matrix;
};