力扣HOT100刷题记录-矩阵-题解-54.螺旋矩阵

5 阅读2分钟

螺旋矩阵(Spiral Matrix)题解

题目描述

给定一个 m x n的矩阵,按照螺旋顺序返回所有元素。

示例

输入: 
[[1,2,3],
 [4,5,6],
 [7,8,9]]

输出: [1,2,3,6,9,8,7,4,5]

解题思路

使用边界收缩法,通过维护四个边界变量来模拟螺旋遍历过程:

  • top:上边界
  • bottom:下边界
  • left:左边界
  • right:右边界

算法步骤

  1. 初始化四个边界和剩余元素计数
  2. 按照右→下→左→上的顺序循环遍历
  3. 每完成一个方向,收缩对应边界
  4. 当所有元素都被处理时结束循环

代码实现

#include<iostream>
#include<vector>

using namespace std;

int main(){
    vector<vector<int>> matrix = {{1,2,3},{4,5,6},{7,8,9}};

    int m=matrix.size();
    int n=matrix[0].size();
    int nums=m*n;

    vector<int> result;

    int left=0,right=n-1,top=0,bottom=m-1;
    while(nums--){
        //向右
        for(int i=left;i<=right&&nums>=0;i++){
            result.push_back(matrix[top][i]);
        }
        top++;

        //向下
        for(int i=top;i<=bottom&&nums>=0;i++){
            result.push_back(matrix[i][right]);
        }
        right--;

        //向左  
        for(int i=right;i>=left&&nums>=0;i--){
            result.push_back(matrix[bottom][i]);
        }
        bottom--;

        //向上
        for(int i=bottom;i>=top&&nums>=0;i--){
            result.push_back(matrix[i][left]);
        }
        left++;
    }

    for(int i=0;i<result.size();i++){
        cout<<result[i]<<" ";
    }
}

执行过程演示

3x3矩阵为例:

初始状态

  • 边界:top=0, bottom=2, left=0, right=2
  • 剩余元素:9

第一轮

  1. 向右:遍历(0,0)→(0,1)→(0,2),输出[1,2,3],剩余6元素
  2. 向下:遍历(1,2)→(2,2),输出[6,9],剩余4元素
  3. 向左:遍历(2,1)→(2,0),输出[8,7],剩余2元素
  4. 向上:遍历(1,0),输出[4],剩余1元素

第二轮

  1. 向右:遍历(1,1),输出[5],剩余0元素

最终输出:[1,2,3,6,9,8,7,4,5]

关键特性

  • 边界检查:每个循环都检查 nums > 0,防止重复处理
  • 对称收缩:每次完成一个方向后收缩对应边界
  • 顺序固定:始终按照右→下→左→上的顺序

复杂度分析

  • 时间复杂度:O(m × n),每个元素只访问一次
  • 空间复杂度:O(1),只使用常数个额外变量(输出数组不计入)