LeetCode 54. Spiral Matrix

题目核心是矩阵遍历。以前做过类似的题,不过是正方形的情况。我都是由外向内,层一个for循环,四个方向一个for循环,坐标计算相对复杂。

换一种思路,记矩阵左上角坐标(i1,j1),右下角(i2,j2)。一个大的while循环,按照四个方向遍历,缩小矩阵。其实思路和之前一样,只不过规避掉了坐标繁琐的计算。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if (matrix.size()==0) return res;
        int i1=0, i2=matrix.size()-1;
        int j1=0, j2=matrix[0].size()-1;
        while (i1<=i2 && j1<=j2){
            for (int j=j1;j<=j2;++j) 
                res.push_back(matrix[i1][j]);
            for (int i=i1+1;i<=i2;++i) 
                res.push_back(matrix[i][j2]);
            if (i1<i2){ //如果不判断,只有一行的情况会重复输出
                for (int j=j2-1;j>=j1;--j) 
                    res.push_back(matrix[i2][j]);
            }
            if (j1<j2){
                for (int i=i2-1;i>=i1+1;--i) 
                    res.push_back(matrix[i][j1]);    
            }
            ++i1; ++j1;
            --i2; --j2;
        }
        return res;
    }
};

猜你喜欢

转载自www.cnblogs.com/hankunyan/p/9127515.html