**LeetCode 54. Spiral Matrix

https://leetcode.com/problems/spiral-matrix/


水题做成这个样子真是说不过去,,

四个变量控制,两个控制左右范围,另个控制上下范围

两种特殊情况,只有一行和一列,因为push_back的时候其实只是考虑了行或者列的情况没有综合考虑 所以容易重复


#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <iostream>

using namespace std;

class Solution {
public:
    vector<int> spiralOrder( vector<vector<int> >& matrix) {
        vector <int> ret;
        if(matrix.size() == 0)
            return ret;
        if(matrix.size() == 1)return matrix[0];
        int left = 0, right = matrix[0].size(),hang=matrix.size(), h0=0;
        while(ret.size() < matrix.size()*matrix[0].size()) {
            //up
            for(int i=left;i<right;i++)
                ret.push_back(matrix[h0][i]);
            if(ret.size() >= matrix.size()*matrix[0].size() ) break;
            //right
            for(int i=h0+1;i<hang;i++)
                ret.push_back(matrix[i][right-1]);
            if(ret.size() >= matrix.size()*matrix[0].size() ) break;
            //down
            for(int i=right-2;i>=left;i--)
                ret.push_back(matrix[hang-1][i]);
            if(ret.size() >= matrix.size()*matrix[0].size() ) break;
            //left
            for(int i=hang-2;i>h0;i--)
                ret.push_back(matrix[i][left]);
            left ++;
            right --;
            hang --;
            h0++;
        }
        return ret;
    }
};

int main() {
    //freopen("54.txt", "r", stdin);
    int n,m, in;
    while(cin >> n >> m ){
        vector < vector<int> > mx;
        for(int i=0;i<n;i++) {
            vector <int> ivec;
            for(int j=0;j<m;j++) {
                cin >> in;
                ivec.push_back(in);
            }
            mx.push_back(ivec);
        }
        Solution s;
        vector <int> ans = s.spiralOrder(mx);
        for(int i=0;i<ans.size();i++)
            cout << ans[i] << ", ";
        cout << endl;
    }
    return 0;
}



你可能感兴趣的:(**LeetCode 54. Spiral Matrix)