给你一个 m 行 n 列的知阵 matrix ,
请按照 顺时针螺旋顺序,返回知阵中的所有元素
首先,让我们来说明一下解决这个问题的思路:
- 我们可以模拟一个顺时针螺旋的运动路径,从左上角开始,逐渐向右、向下、向左、向上移动,每次移动时都会更新边界。
- 我们使用四个边界变量来跟踪当前处理的矩阵范围:top,bottom,left,right。
- 我们初始化这些边界变量,然后在每个方向上移动,同时添加当前元素到结果数组中,然后更新边界变量。
- 我们继续这个过程,直到遍历完所有元素。
接下来,让我们通过带有注释的 JavaScript 代码来实现这个算法:
function spiralOrder(matrix) {
if (!matrix || matrix.length === 0 || matrix[0].length === 0) {
return [];
}
const result = [];
let top = 0,
bottom = matrix.length - 1,
left = 0,
right = matrix[0].length - 1;
while (top <= bottom && left <= right) {
// 从左到右
for (let i = left; i <= right; i++) {
result.push(matrix[top][i]);
}
top++; // 上边界向下收缩
// 从上到下
for (let i = top; i <= bottom; i++) {
result.push(matrix[i][right]);
}
right--; // 右边界向左收缩
// 从右到左
if (top <= bottom) {
for (let i = right; i >= left; i--) {
result.push(matrix[bottom][i]);
}
bottom--; // 下边界向上收缩
}
// 从下到上
if (left <= right) {
for (let i = bottom; i >= top; i--) {
result.push(matrix[i][left]);
}
left++; // 左边界向右收缩
}
}
return result;
}
// 示例用法
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
const result = spiralOrder(matrix);
console.log(result); // 输出 [1, 2, 3, 6, 9, 8, 7, 4, 5]
这段代码将会按照题目要求,以顺时针螺旋顺序返回矩阵中的所有元素。