螺旋矩陣[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; }