题解 | #螺旋矩阵#
螺旋矩阵
http://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31
用循环,一轮控制一个变量,复制上面一行时,变动列数。复制右边一列时,变动行数。
复制下面一行时,变动列数。复制左边一列时,变动行数。
每复制完一行或一列,边界移动一行或一列。
复制一圈是4个for循环,但不确定是在上下左右那个for循环中终结,
所以每个for之后配一个跳出循环出口,条件是元素个数达标
int* spiralOrder(int** matrix, int matrixRowLen, int* matrixColLen, int* returnSize ) {
int* arr; //新建输出数组
int cnt = matrixRowLen * (*matrixColLen); //所有元素个数=行数*列数
*returnSize = cnt; //定义返回数组的大小
arr = (int*)malloc(sizeof(int) * cnt); //为新数组申请指定大小的空间
int up = 0, down = matrixRowLen -1; //上边界和下边界
int left = 0, right = *matrixColLen - 1; //左边界和右边界
int i = 0, tmp = 0; //原数组和新数组指针变量
while(1){
for(i = left; i<=right; i++) //打印上面一行
arr[tmp++] = matrix[up][i];
if(tmp>=cnt) //可能收网
break;
up++; //上边界下移一行
for(i = up; i<= down; i++) //打印右边一列
arr[tmp++] = matrix[i][right];
if(tmp>=cnt)
break;
right--; //右边界左移一位
for(i = right; i>=left; i--) //打印下面一行
arr[tmp++] = matrix[down][i];
if(tmp>=cnt)
break;
down--; //下边界上移一行
for(i = down; i>= up; i--) //打印左边一列
arr[tmp++] = matrix[i][left];
if(tmp>=cnt)
break;
left++; //左边界右移一列
} //继续打印下一圈
return arr;
}