题目
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
解题思路:常规思路即可破题。
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
if(!matrixSize){*returnSize=0;return NULL;}
int i=0,j=0,n=0;//i,j当前行列 n当前已有的returnsize大小
int LeftEdge=0,RightEdge=0,UpEdge=1,DownEdge=0;
int dir=0;//0-向左 1-向下 2-向右 3-向上
*returnSize=matrixSize*(*matrixColSize);
//初始化返回数组并为其分配大小
int*ret=(int*)malloc(sizeof(int)*(*returnSize));
while(n<*returnSize)
{
//printf("[%d,%d] ",i,j);
ret[n]=matrix[i][j];
n++;
if(dir==0)j++;
else if(dir==1)i++;
else if(dir==2)j--;
else if(dir==3)i--;
if(dir==0&&j==*matrixColSize-RightEdge)
{//到达右边边界时,方向改成向下移动
j--;
i++;
dir=1;
RightEdge++;
}
if(dir==1&&i==matrixSize-DownEdge)
{//到达下边边界时,方向改成向左移动
i--;
j--;
dir=2;
DownEdge++;
}
if(dir==2&&j==LeftEdge-1)
{//到达左边边界时,方向改成向上移动
j++;
i--;
dir=3;
LeftEdge++;
}
if(dir==3&&i==UpEdge-1)
{//到达上边边界时,方向改成向右移动
i++;
j++;
dir=0;
UpEdge++;
}
}
return ret;
}
这道题做了两天才做出来,一直卡在传入值为空数组([]),如何返回指针的问题上。
一直想通过判断* returnSize为零,来返回指针。
遇到的问题:
1.不知道要return NULL,还以为是return 0
记住:指针返回地址!!!
2.一直在判断matrixSize*(*matrixColSize)==0是不是成立,一直没跑通。现在也没想通是为什么,可能matrixSize为0的时候,matrixColSize 为空指针?
if(!matrixSize){returnSize=0;return NULL;}
成功跑通!
结论就是指针还不熟悉