LeetCode 「中等」54.螺旋矩阵
题目描述
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入: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]
解答
- 定义边界:
- 使用4个变量表示当前遍历的边界:上下左右
- 初始时,上边界为第一行,下边界为最后一行,左边界为第一列,右边界为最后一列
- 模拟遍历:
- 按照顺时针遍历,依次处理上、右、下、左四个边界
- 每遍历完一个边界后,调整相应的边界值
- 终止条件:
- 当上边界超过下边界,或左边界超过右边界时,遍历结束
- 处理特殊情况:
- 当矩阵只有一行或者一列时,直接按顺序输出即可
Code
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
if (!matrix.length) return matrix;
const ans = [];
let top = 0// 上边界
let bottom = matrix.length - 1; // 下边界
let left = 0; // 左边界
let right = matrix[0].length - 1; // 右边界
while (top <= bottom && left <= right) {
// 左到右
for (let i = left; i <= right; ++i) {
ans.push(matrix[top][i]);
}
++top;
// 上到下
for (let j = top; j <= bottom; ++j) {
ans.push(matrix[j][right]);
}
--right;
// 右到左
if (top <= bottom) {
for (let k = right; k >= left; --k) {
ans.push(matrix[bottom][k]);
}
--bottom;
}
// 下到上
if (left <= right) {
for (let l = bottom; l >= top; --l) {
ans.push(matrix[l][left]);
}
++left;
}
}
return ans;
};
