1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
循环遍历 flag=0时代表的是第一行 即1 2 3 4 5
flag=1 时遍历 10 15 20
flag=2 时遍历 19 18 17 16
flag=3 时遍历 11 6
整个矩阵可以从外到里这样一圈圈遍历 但是要注意没遍历完一圈都要重新修改边界值
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
* returnSize=0;
int r=matrixSize,c=* matrixColSize;
if(matrix==NULL || r==0) return matrix;
int *answer=(int*)malloc((10000)*sizeof(int));
int i=0;
int j=0;
int k=0;
int flag=0;
int limit1=* matrixColSize;
int limit2=matrixSize;
int limit3=0;
int limit4=1;
int m=0;
*returnSize=r*c;
while(k<*returnSize)
{
if(flag==0)
{
for(m=j;m<limit1&&k<*returnSize;m++)
{
answer[k]=matrix[i][m];
k+=1;
}
j=m-1;
flag=1;
limit1-=1;
}
else if(flag==1)
{
for(m=i+1;m<limit2&&k<*returnSize;m++)
{
answer[k]=matrix[m][j];
k+=1;
}
i=m-1;
flag=2;
limit2-=1;
}
else if(flag==2)
{
for(m=j-1;m>=limit3;m--)
{
answer[k]=matrix[i][m];
k+=1;
}
j=m+1;
flag=3;
limit3+=1;
}
else{
for(m=i-1;m>=limit4&&k<*returnSize;m--)
{
answer[k]=matrix[m][j];
k+=1;
}
i=m+1;
j+=1;
flag=0;
limit4+=1;
}
}
return answer;
}
和上一题思路基本一致
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
int** answer=(int**)malloc(sizeof(int*)*n);
if(n==0)
{
*returnSize=0;
return answer;
}
int i=0;
int j=0;
int k=0;
int flag=0;
int limit1=n;
int limit2=n;
int limit3=0;
int limit4=1;
int m=0;
*returnSize=n*n;;
for(i=0;i<n;i++)
answer[i]=(int*)malloc(sizeof(int)*n);
i=0;
while(k<*returnSize)
{
if(flag==0)
{
for(m=j;m<limit1&&k<*returnSize;m++)
{
answer[i][m]=k+1;
k+=1;
}
j=m-1;
flag=1;
limit1-=1;
}
else if(flag==1)
{
for(m=i+1;m<limit2&&k<*returnSize;m++)
{
answer[m][j]=k+1;
k+=1;
}
i=m-1;
flag=2;
limit2-=1;
}
else if(flag==2)
{
for(m=j-1;m>=limit3;m--)
{
answer[i][m]=k+1;
k+=1;
}
j=m+1;
flag=3;
limit3+=1;
}
else{
for(m=i-1;m>=limit4&&k<*returnSize;m--)
{
answer[m][j]=k+1;
k+=1;
}
i=m+1;
j+=1;
flag=0;
limit4+=1;
}
}
*returnColumnSizes = (int *)malloc(n*sizeof(int));
for (i=0; i<n; i++)
(*returnColumnSizes)[i] = n;
*returnSize=n;
return answer;
}