59.螺旋矩阵Ⅱ
给你一个正整数 n
,生成一个包含 1
到 n²
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
代码
// @lc code=start
/**
* @param {number} n
* @return {number[][]}
*/
//循环不变量原则——左闭右开
var generateMatrix = function(n) {
let startx = 0 ,starty = 0;//起始位置[0,0]
let loop = Math.floor(n / 2);//循环圈数
let mid = Math.floor(n / 2);//中间位置
let offset = 1;//控制每边长度
let count =1;//更新填充数字1,2,3...
/* js创建二维数组
const arr1 = Array(3).fill(0).map(x => Array(3).fill(0));
*/
let res = Array(n).fill(0).map(res => Array(n).fill(0));
//循环
//n为偶数
while (loop) {
let row = startx, col = starty;
//左->右
for (; col < n - offset; col++) {
res[row][col] = count;
count ++;
}
//上->下
for (; row < n - offset; row++) {
res[row][col] = count;
count ++;
}
//右->左
for (; col > starty; col--) {
res[row][col] = count;
count ++;
}
//下->上
for (; row > startx; row--) {
res[row][col] = count;
count ++;
}
//更新起始位置[1,1],...
startx ++;
starty ++;
//更新offset2,3...
offset ++;
//更新loop
loop --;
}
//n为奇数
if (n % 2 == 1) {
res[mid][mid] = count;
}
//返回数组结果
return res;
};
54. 螺旋矩阵
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
代码
// @lc code=start
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function (matrix) {
let m = matrix.length, n = matrix[0].length;//m行n列
let count = m * n;//一共有多少个数
let res = new Array();//存储结果
let x = [0, 1, 0, -1]//x方向变化
let y = [1, 0, -1, 0]//y方向变化
let row = 0, col = 0;//行列变化
let dir = 0;//方向
let vis = Array(m).fill(false).map(res => Array(n).fill(false));//新建一个二维存储已经遍历过的值
//当res长度小于总数时
while (res.length < count) {
res.push(matrix[row][col]);
//将已经遍历过的值赋为true
vis[row][col] = true;
//判断是否合法、或者已经遍历过的,
if (!isLegal(row + x[dir],col + y[dir], m, n) || vis[row + x[dir]][col + y[dir]] == true) {
//换方向
dir++;
dir = dir % 4;
}
row = row + x[dir];
col = col + y[dir];
}
return res;
};
//判断是否合法,合法返回true,不合法则为false
function isLegal(x, y, m, n) {
return x >= 0 && y >= 0 && x < m && y < n;
}
总结
循环不变量原则——左闭右开。