LintCode - 374. 螺旋矩阵

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Miss_yuan/article/details/79160102

描述:

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


样例:

给定如下矩阵:

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

应返回 [1,2,3,6,9,8,7,4,5]


class Solution {
public:
    /*
     * @param matrix: a matrix of m x n elements
     * @return: an integer list
     */
    vector<int> spiralOrder(vector<vector<int>> &matrix) {
        // write your code here
        
        vector<int> v;
        
        if(matrix.size()==0)
            return v;
        if(matrix[0].size()==0)
            return v;

        int m = matrix[0].size();
        int n = matrix.size();
        int x = 0;
        int y = 0;

        while(1){
            //向右遍历m个点
            for(int i =0; i < m; i++){
                v.push_back(matrix[x][y+i]);
            }
            // 所有行遍历完成,无法继续向下遍历
            if(--n ==0)
                break;
            // 更新向下遍历的初始坐标值
            y += (m-1);
            x++;

            //向下遍历n个点
            for(int i =0; i < n; i++){
                v.push_back(matrix[x+i][y]);
            }
            // 所有列遍历完成,无法继续向左遍历
            if(--m == 0)
                break;
            // 更新向左遍历的初始坐标值
            x += (n-1);
            y--;
            
            //向左遍历m个点
            for(int i =0; i < m; i++){
                v.push_back(matrix[x][y-i]);
            }
            // 所有行遍历完成,无法继续向上遍历
            if(--n == 0)
                break;
            // 更新向上遍历的初始坐标值
            y -= (m-1);
            x--;
            
            //向上遍历n个点
            for(int i =0; i < n; i++){
                v.push_back(matrix[x-i][y]);
            }
            // 所有列遍历完成,无法继续向右遍历
            if(--m == 0)
                break;
            // 更新向右遍历的初始坐标值
            x -= (n-1);
            y++;
        }
        return v;
    }
};



猜你喜欢

转载自blog.csdn.net/Miss_yuan/article/details/79160102