LeetCode 54. Spiral Matrix

本文介绍了一种矩阵螺旋遍历的算法实现,通过模拟粒子在矩阵中沿螺旋路径移动的过程来遍历矩阵元素。该算法定义了初始位置、速度及边界,并根据粒子达到不同边界的情况调整边界值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 题目描述
    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,
Given the following matrix:

[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
2. 解题思路
题目大概意思就是回型输出一个矩阵,在这里我的想法是模拟粒子的移动,粒子运动不得超出边框,每次到达边框边框就会缩小。
初始位置: (0,0)
初始速度:iv=0,jv=1;(向右走)
初始边界:int upb=-1,lowb=matrix.size(),leftb=-1,rightb=matrix[0].size();
边界的变化情况:
(1) 到达上边界,则左边界++
(2) 到达下边界,则右边界–
(3) 到达左边界,则下边界–
(4) 到达右边界,则上边界++
3. 实现代码

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> >& matrix) {
        vector <int> res;
        if(matrix.size()==0)
            return res;
        int i=0,j=0;
        int iv=0,jv=1;
        int upb=-1,lowb=matrix.size(),leftb=-1,rightb=matrix[0].size();
        int count=0;
        while(1){
            if(count==matrix.size()*matrix[0].size())
                break;
            //cout<<matrix[i][j]<<"---"<<count<<endl;; 
            res.push_back(matrix[i][j]);
            ++count;
            int ti=i,tj=j;
            if(ti+iv==lowb){
                iv=0;
                jv=-1;
                --rightb;
            }
            else if(ti+iv==upb){
                iv=0;
                jv=1;
                ++leftb;
            }
            else if(tj+jv==rightb){
                iv=1;
                jv=0;
                ++upb;
            }
            else if(tj+jv==leftb){
                iv=-1;
                jv=0;
                --lowb;

            }
            i+=iv;
            j+=jv;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值