54. 螺旋矩阵https://leetcode.cn/problems/spiral-matrix/
难度中等1346
给你一个 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]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
/**
* @param {number[][]} matrix
* @return {number[]}
*/
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
];
var spiralOrder = function (matrix) {
let arr = [];
let rows = matrix.length;
let col = matrix[0].length;
let top = 0,
bottom = rows - 1;
let left = 0,
right = col - 1; //设置左右边界
console.log(rows, "行", col, "列");
while (top <= bottom && right >= left) {
for (let column = left; column <= right; column++) {
arr.push(matrix[top][column]); //从当前这一圈的顶部添加,限制top,控制向右移动的column
}
for (let row = top + 1; row <= bottom; row++) {
arr.push(matrix[row][right]); //从当前这圈的右侧添加,固定右边界限,控制从上往下读取数据的row
}
if (top < bottom && right > left) {
//在左右,上下都未重合的情况下,继续下边和左边的添加
for (let column = right - 1; column > left; column--) {
arr.push(matrix[bottom][column]); //固定底部界限,从右向左的column读到右边界的值后,自减,向左移动,但不移动到底,留一位
}
for (let row = bottom; row > top; row--) {
//从刚刚留下的位置开始,固定左边界限,控制row读取底边的值,自减,向上移动到小于top界限的位置
arr.push(matrix[row][left]);
}
} //至此就完成了一个具有上下左右的一圈的读取
left++;
bottom--;
top++;
right--; //指向位置 向内收拢一圈
}
console.log(arr);
};
spiralOrder(matrix);
控制由外到内一层层读取,只需注意边界的限制即可