LeetCode 「中等」54.螺旋矩阵

sankigan2025-2-26算法LeetCode

螺旋矩阵open in new window

题目描述

给你一个 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]

解答

  1. 定义边界:
  • 使用4个变量表示当前遍历的边界:上下左右
  • 初始时,上边界为第一行,下边界为最后一行,左边界为第一列,右边界为最后一列
  1. 模拟遍历:
  • 按照顺时针遍历,依次处理上、右、下、左四个边界
  • 每遍历完一个边界后,调整相应的边界值
  1. 终止条件:
  • 当上边界超过下边界,或左边界超过右边界时,遍历结束
  1. 处理特殊情况:
  • 当矩阵只有一行或者一列时,直接按顺序输出即可
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;
};
更新于 2025/3/20 23:23:29
ON THIS PAGE