螺旋矩阵[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;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值