[C++]LeetCode: 110 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. 需要注意的是,我们在向左遍历和向上遍历时,需要要遍历的行或者列是否存在,避免重复。

Attention:

1. 维护四个变量,来界定螺旋线遍历边界。

int rowBegin = 0;
int rowEnd = row - 1;
int colBegin = 0;
int colEnd = col - 1;
2. 螺旋行走条件必须满足。

while (rowBegin <= rowEnd && colBegin <= colEnd)
3. 向左遍历和向上遍历时,为防止重复,需要先判断行列坐标值。

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++; //遍历后,去掉此列
复杂度:O(N), N为矩阵的元素总数

AC Code:

class Solution {
public:
    vector spiralOrder(vector > &matrix) {
        vector 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;
    }
};





你可能感兴趣的:(LeetCode)