第一步:问题分析
遍历问题,还没有想到是什么数据结构,就想着按照思路去打印。
第二步:阐述你的思路,比如打算用什么算法或者数据结构去解决这个问题,通过描述看是否行得通
自己的思路就是模拟这个打印的过程,先按行从左到右输出,然后从上到下,再从右到左,再从下到上,顺时针循环,直到m*n个数全部被打印出来未知,用了一个while循环。
内部有设置统计每回要循环的次数的装置:a,b,c,d
要注意先对特殊值进行处理,比如这个矩阵是空的,比如矩阵长度小于0了的情况。
下来while内部的循环就按照打印思路来写,改了不少遍才出的结果,要不断调试找出问题。在打印的时候,初始下标与结束下标都是在不断变化的。
开始写代码
我自己写的多多少少还是有些问题,实现了3*3
的输出,但没实现4*4
的输出,还有就是特殊处理。
- 运行出现问题:
Line 923: Char 9: runtime error: reference binding to null pointer of type 'std::vector<int, std::al
原因是因为没有做特殊处理,对于空指针没有特殊处理导致错误。OK,以后要多注意,不然就是重大bug。
最终参照了官方给的题解才有了如下代码:
#include<iostream>
#include<vector>
using namespace std;
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
vector<int> re;
//特殊处理:指针为空的情况
if(matrix.empty())
return re;
int m = matrix.size();
int n = matrix[0].size();
vector<int> r(m*n, 0);
//特殊处理m或者n小于等于0的情况
if(m*n <= 0)
return r;
//d=left行的最小值, b=right行的最大值, a=top列的最小值, c=button列的最大值
int a=0, b=n-1, c=m-1, d=0;
int x=0;
int flag=m*n;
while(flag>0 && a <= c && d <= b)
{
//从左往右
for(int j=d; j<=b; j++)
{
r[x++] = matrix[a][j];
flag--;
}
if(flag<=0)
break;
//从上到下
for(int i=a+1; i<=c; i++)
{
r[x++] = matrix[i][b];
flag--;
}
if(flag<=0)
break;
if (a < c && d < b)
{
//从右往左
for(int j=b-1;j>d;j--)
{
r[x++] = matrix[c][j];
flag--;
}
if(flag<=0)
break;
//从下往上
for(int i=c;i>a;i--)
{
r[x++] = matrix[i][d];
flag--;
}
if(flag<=0)
break;
}
d = d+1;
a = a+1;
b = b-1;
c = c-1;
}
return r;
}
int main()
{
int a[3] = {1,2,3};
vector<vector<int>> array(3);
for(int i=0;i<array.size();i++)
{
array[i] = vector<int>(3,i+1);//给每个vv1[i]分配5个对应下标元素i+1的内容,即第一行全为0,第二行权威1,以此类推
}
vector<int> re=spiralOrder(array);
for(int i=0;i<9;i++)
{
cout<<re[i]<<endl;
}
return 0;
}