LeetCode-54. 螺旋矩阵

本文详细解析了LeetCode第54题螺旋矩阵的算法实现,介绍了如何按顺时针螺旋顺序遍历矩阵,并提供了一种利用标记数组跟踪已访问元素的方法。

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

题目:

leetcode第54题--螺旋矩阵

要求:

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

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

示例 2:

输入:
[
  [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个过程,分别为向右、向下、向左、向上。碰到边界或者已经走过的行或列改变方向,一直重复这个过程直到走完全部。因此可以新建一个记录是否走过该位置的表,通过查询这个位置表改变行走方向。因此本代码先建立位置表,定义四个过程,然后一直重复走下去。

程序:

    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;    //用来保存结果


        //处理单行或者单列或者空组的情况
        int h = matrix.size(); 
        if(h==0) return res;
        int l = matrix[0].size();
        if(h==1){
            for(int o = 0;o < l;o ++){
                res.push_back(matrix[0][o]);
            }
            return res;
        }
        if(l==1){
            for(int o = 0;o < h;o ++){
                res.push_back(matrix[o][0]);
            }
            return res;            
        }
        

        //使用step变量表示需要走的过程,1代表想做,2代表向下,3代表向左,4代表向上
        int step = 1;
        int i = 0, j = 0;
        

        //新建位置表
        vector<int> flag_j;
        int m = 0;
        while(m < l){
            m++;
            flag_j.push_back(0);
        }
        
        vector<vector<int>> flag;
        int k = 0;
        
        while(k<h){
            k++;
            flag.push_back(flag_j);
        }
        

        //根据位置表进行行走
        while(flag[i][j]==0){

            res.push_back(matrix[i][j]);
            flag[i][j] = 1;
            
            switch(step){
                case 1:{
                    j++;
                    if(j>=l||flag[i][j]==1){
                        step = 2;
                        j--;
                        i++;
                    }
                    break;
                }            
                case 2:{
                    i++;
                    if(i>=h||flag[i][j]==1){
                        step = 3;
                        i--;
                        j--;
                    }
                    break;                    
                }
                case 3:{
                    j--;
                    if(j<0||flag[i][j]==1){
                        step = 4;
                        j++;
                        i--;
                    }                    
                    break;
                }
                case 4:{
                    i--;
                    if(i<0||flag[i][j]==1){
                        step = 1;
                        i++;
                        j++;
                    }                    
                    break;
                }
            }

        }
        return res;
    }

结果:

最终结果尽然显示超过100%用户,用时0ms,可能这个计算不太准,仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值