/**
 * 
 * @param matrix int整型二维数组 
 * @param matrixRowLen int matrix数组行数
 * @param matrixColLen int* matrix数组列数
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */
int* spiralOrder(int** matrix, int matrixRowLen, int* matrixColLen, int* returnSize ) {
    // write code here
   int top=0,bottom=matrixRowLen-1,left=0,right=*matrixColLen-1;//上边界,下边界,左边界,右边界
    int len = matrixRowLen * *matrixColLen;//计算矩阵大小
    int* arr = (int*)malloc(sizeof(int)*len);//申请新数组 存放遍历的数据
    if(len==0){return arr;}
    int index=0;
    while(top<bottom&&left<right){//不能超过边界
        for(int i=left;i<right;i++){
            arr[index++]=matrix[top][i];
        }   //从左到右
        for(int i=top;i<bottom;i++){
            arr[index++]=matrix[i][right];
        } //从上到下
        for(int i=right;i>left;i--){
            arr[index++]=matrix[bottom][i];
        }//从右到左
        for(int i=bottom;i>top;i--){
            arr[index++]=matrix[i][left];
        }  //从下到上
        //缩圈(缩小遍历范围)
        left++;top++;bottom--;right--;
    }
    //剩余单行或单列
    if(top==bottom){//剩余单行
        //直接从左到右遍历完
        for(int i=left;i<=right;i++){arr[index++]=matrix[top][i];}
    }else if(left==right){//剩余单列
        //从上到下遍历完
        for(int i=top;i<=bottom;i++){arr[index++]=matrix[i][right];}
    }
    *returnSize = len;
    return arr;
}
// [1,2,3]
// [4,5,6]
// [7,8,9]