相信找到这里的友军,应该对这个算法的原理已经有所了解,这里就不啰嗦了,直接上料:
#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;
}