天天看點

螺旋矩陣[leetcode]cpp

相信找到這裡的友軍,應該對這個算法的原理已經有所了解,這裡就不啰嗦了,直接上料:

#include <iostream>

#include <vector>

using namespace std;

//給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,傳回矩陣中的所有元素。

//輸入:

//[

//  [1, 2, 3],

//  [4, 5, 6],

//  [7, 8, 9]

//]

//輸出: [1,2,3,6,9,8,7,4,5]

//輸入:

//[

//  [1, 2, 3, 4],

//  [5, 6, 7, 8],

//  [9,10,11,12]

//]

//輸出: [1,2,3,4,8,12,11,10,9,5,6,7]

//輸入:

//  [1,  2,  3,  4,  5],

//  [6,  7,  8,  9,  10],

//  [11, 12, 13, 14, 15],

//  [16, 17, 18, 19, 20]

//輸出: [1,2,3,4,8,12,11,10,9,5,6,7]

class Solution {

public:

    vector<int> spiralOrder(vector<vector<int>>& matrix) {

        vector<int> res;

        res.clear();

        if (0==matrix.size()) return res;  

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

        int n=matrix.size();

        if (!m|!n)    return res; 

        int i=0,j=0,a=0,b=0,c=0,d=0;

        int ems=m*n;

        while(1){

            for(i=a;i<m;i++) res.push_back(matrix[j][i]); //向右找

            if (ems==res.size()) break;

            i--;

            for(j=b+1;j<n;j++) res.push_back(matrix[j][i]); //向下找

            if (ems==res.size()) break;

            j--;

            for(i=m-2;i>=c;i--) res.push_back(matrix[j][i]);//向左找

            if (ems==res.size()) break;

            i++;

            for(j=n-2;j>d;j--) res.push_back(matrix[j][i]);//向上找

            if (ems==res.size()) break;

            j++;

            m--; n--; a++; b++; c++; d++;//利用m,n,a,b,c,d這幾個參數逐漸收縮

        }  

        return res; 

    }

    vector<int> spiralOrder2(vector<vector<int>>& matrix) {

        vector<int> res;

        res.clear();

        if (0==matrix.size()) return res; 

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

        int n=matrix.size();

        if (!m|!n)    return res; 

        int i=0,j=0,a=0,b=0,c=0,d=0;

        int ems=m*n;

        int cn=0; 

        while(1){

            for(i=a;i<m;i++) {

                res.push_back(matrix[j][i]); 

                cn++;

            }

            if (ems==cn) break;

            i--;

            for(j=b+1;j<n;j++) {

                res.push_back(matrix[j][i]); 

                cn++;

            }

            if (ems==cn) break;

            j--;

            for(i=m-2;i>=c;i--) {

                res.push_back(matrix[j][i]); 

                cn++;

            }

            if (ems==cn) break;

            i++;

            for(j=n-2;j>d;j--) {

                res.push_back(matrix[j][i]); 

                cn++;

            }  

            if (ems==cn) break;

            j++;

            m--; n--; a++; b++; c++; d++;

        }  

        return res;  

    }

};

dev tool:  devcpp

#include <iostream>

#include <vector>

#include "solution.h"

using namespace std;

int main(int argc, char** argv) {

    int i=0,j=0;

    //test();

    Solution sn;

    vector<vector<int>> matrix;

    vector<int> in; 

    vector<int> res;

    //    

//  [1,  2,  3,  4,  5],

//  [6,  7,  8,  9,  10],

//  [11, 12, 13, 14, 15],

//  [16, 17, 18, 19, 20]

//    in.clear();

//    for(i=1;i<=5;i++) in.push_back(i);

//    matrix.push_back(in);

//    

//    in.clear();

//    for(i=6;i<=10;i++) in.push_back(i);

//    matrix.push_back(in);

//    

//    for (i=0;i<2;i++){

//        cout<<"[";

//        for(j=0;j<5;j++) cout<<matrix[i][j]<<" ";

//        cout<<"],\n";

//    }

//    cout<<endl;

//    res.clear();

//    res=sn.spiralOrder(matrix);

//    cout<<"[";

//    for (i=0;i<10;i++) cout<<res[i]<<" ";

//    cout<<"]\n";

//    cout<<endl;

//    cout<<"size:"<<res.size();

//    cout<<endl;

 [1,  2,  3,  4,  5],

 [6,  7,  8,  9,  10],

 [11, 12, 13, 14, 15],

 [16, 17, 18, 19, 20]

//

//    

//    in.clear();

//    for(i=1;i<=5;i++) in.push_back(i);

//    matrix.push_back(in);

//    

//    in.clear();

//    for(i=6;i<=10;i++) in.push_back(i);

//    matrix.push_back(in);

//    

//    in.clear();

//    for(i=11;i<=15;i++) in.push_back(i);

//    matrix.push_back(in);

//    

//    in.clear();

//    for(i=16;i<=20;i++) in.push_back(i);

//    matrix.push_back(in);

//    

//    for (i=0;i<4;i++){

//        cout<<"[";

//        for(j=0;j<5;j++) cout<<matrix[i][j]<<" ";

//        cout<<"],\n";

//    }

//    cout<<endl;

//    res.clear();

//    res=sn.spiralOrder(matrix);

//    cout<<"[";

//    for (i=0;i<20;i++) cout<<res[i]<<" ";

//    cout<<"]\n";

//    cout<<endl;

//    cout<<endl;

    in.clear();

    for(i=1;i<=3;i++) in.push_back(i);

    matrix.push_back(in);

    in.clear();

    for(i=4;i<=6;i++) in.push_back(i);

    matrix.push_back(in);

    in.clear();

    for(i=7;i<=9;i++) in.push_back(i);

    matrix.push_back(in);

    for (i=0;i<3;i++){

        cout<<"[";

        for(j=0;j<3;j++) cout<<matrix[i][j]<<" ";

        cout<<"],\n";

    }

    cout<<endl;

    res.clear();

    res=sn.spiralOrder(matrix);

    cout<<"[";

    for (i=0;i<9;i++) cout<<res[i]<<" ";

    cout<<"]\n";

    getchar();

    return 0;

}