**LeetCode 54. Spiral Matrix

来源:互联网 发布:icmp协议的ip端口号 编辑:程序博客网 时间:2024/04/29 17:13

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;}



0 0