用循环,一轮控制一个变量,复制上面一行时,变动列数。复制右边一列时,变动行数。
复制下面一行时,变动列数。复制左边一列时,变动行数。
每复制完一行或一列,边界移动一行或一列。
复制一圈是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; }