Spiral Matrix (螺旋输出矩阵元素)

本文介绍了一种矩阵螺旋遍历的算法实现,该算法通过维护四个边界变量来控制遍历的过程,确保遍历路径符合螺旋形走向。适用于任意大小的矩阵。

题目描述

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]. 

思路:我们来自己画一个螺旋线的行走轨迹。我们会发现,螺旋始终重复四个遍历过程,向右遍历(列递增)-->向下遍历(行递增)-->向左遍历(列递减)-->向上遍历(行递减)。但是在螺旋线行走的过程中,我们的行列的上下边界一直在变。所以我们维护四个变量,rowBegin, rowEnd, colBegin, colEnd. 我们用这个四个变量来指示遍历时的边界。遍历终止条件是rowBegin > rowEnd || colBegin > colEnd. 需要注意的是,我们在向左遍历和向上遍历时,需要要遍历的行或者列是否存在,避免重复。

实现代码:

            class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int> ret;  
        if (matrix.empty()) return ret;  
        int row = matrix.size();  
        int col = matrix[0].size();  
        int rowBegin = 0;  
        int rowEnd = row - 1;  
        int colBegin = 0;  
        int colEnd = col - 1;  
        //螺旋曲线,运动轨迹总是一致的  
        while (rowBegin <= rowEnd && colBegin <= colEnd)  
        {   
            //向右列递增遍历  
            for (int j = colBegin; j <= colEnd; j++)  
            {  
                ret.push_back(matrix[rowBegin][j]);  
            }  
            rowBegin++; //遍历后,去掉此行  
            //向下行递增遍历  
            for (int i = rowBegin; i <= rowEnd; i++)  
            {  
                ret.push_back(matrix[i][colEnd]);  
            }  
            colEnd--;   //遍历后,去掉此列  
            if (rowBegin <= rowEnd)  //防止重复,针对一行的情况;  
            {  
                //向左列递减遍历  
                for (int j = colEnd; j >= colBegin; j--)  
                {  
                    ret.push_back(matrix[rowEnd][j]);  
                }  
            }  
            rowEnd--;   //遍历后,去掉此行  
            if (colBegin <= colEnd)  //防止重复,针对一列的情况;  
            {  
                //向上行递减遍历  
                for (int i = rowEnd; i >= rowBegin; i--)  
                {  
                    ret.push_back(matrix[i][colBegin]);  
                }  
            }  
            colBegin++; //遍历后,去掉此列  
         }  
         return ret;  
    }
};


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值