这题的长和宽有可能不等,所以有可能出现某一圈中有上边没有下边或者有右边没有左边的情况,因此在代码中我在相应位置加入了两个if语句来判断是否是上面的情况(某一圈中有上边没有下边或者有右边没有左边)。
C++代码:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int m = matrix.size();
if (0 == m) return res;
int n = matrix[0].size();
//循环的圈数
int circle = (min(m, n)+1)/2;
for(int i=0;i<circle;++i)
{
//上边
for (int j=i;j<n-i;++j)
res.push_back(matrix[i][j]);
//右边
for (int j=i+1;j<m-i;++j)
res.push_back(matrix[j][n-i-1]);
//下边(如果该圈下边的行标大于上边的行标)
if (m-i-1>i)
{
for ( int j=n-i-2;j>=i;--j)
res.push_back(matrix[m-i-1][j]);
}
//左边(如果该圈左边的列标小于右边的列标)
if (i<n-i-1)
{
for (int j=m-i-2;j>i;--j)
res.push_back(matrix[j][i]);
}
}
return res;
}
};
int main()
{
Solution s;
int k = 1;
vector<vector<int>> vv;
vector<int> v_tmp;
/*v.push_back(7);
vv.push_back(v);
v[0] = 9;
vv.push_back(v);
v[0] = 6;
vv.push_back(v);*/
/*for (int i=0;i<3;++i)
{
vector<int> v_tmp;
for (int j=0;j<5;++j)
{
v_tmp.push_back(k);
++k;
}
vv.push_back(v_tmp);
}*/
/*for (int i=0;i<5;++i)
{
vector<int> v_tmp;
for (int j=0;j<3;++j)
{
v_tmp.push_back(k);
++k;
}
vv.push_back(v_tmp);
}*/
for (int i=0;i<2;++i)
{
vector<int> v_tmp;
for (int j=0;j<3;++j)
{
v_tmp.push_back(k);
++k;
}
vv.push_back(v_tmp);
}
vector<int> res = s.spiralOrder(vv);
for (int i=0;i<res.size();++i)
{
cout<<res[i]<<'\t';
}
cout<<endl;
return 0;
}