54. Spiral Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,

Given the following matrix:

[  [ 1, 2, 3 ],  [ 4, 5, 6 ],  [ 7, 8, 9 ] ]

You should return [1,2,3,6,9,8,7,4,5].

题意:

根据给定的m*n矩阵。返回螺旋排序后的一维数组。

1  2  34  5  67  8  9螺旋排序后的结果为:1,2,3,6,9,8,7,4,5由此可知读取共分四个方向,而且是四个方向的轮回:1)从左到右(横坐标不变,纵坐标逐步加一)。读取结果为:1 2 32)从上到下(纵坐标不变,横坐标逐步加matrixColSize)。读取结果为:6 93)从右往左(横坐标不变,纵坐标逐步减一)读取结果为:8 74)从下往上(纵坐标不变,横坐标逐步减matrixColSize)。读取结果为:4定义brow代表从左到右执行的次数,erow代表从右到左执行的次数;bcol代表从下往上读取次数,ecol代表从上往下读取次数。所以有:1)从左往右读取时,必须从bcol列开始读取,递增直到ecol列。2)从右往左读取时,必须从ecol列开始读取,递减直到bcol列。2)从上往下读取时,必须从brow行开始读取,递增直到erow行。4)从下往上读取时,必须从erow行开始读取,递减直到brow行。

/** * Note: The returned array must be malloced, assume caller calls free(). */int* spiralOrder(int** matrix, int matrixRowSize, int matrixColSize){    if ( !matrix )    {        return NULL;    }        int *dest = ( int *)malloc( sizeof(int) * matrixRowSize * matrixColSize + 1 );    if ( !dest )    {        return NULL;    }        int times = 1;      int numbers = 0;        int brow = 0;    int erow = matrixRowSize - 1;    int bcol = 0;    int ecol = matrixColSize - 1;        int index = 0;    while ( numbers < matrixRowSize * matrixColSize )    {        if ( times % 4 == 1 )        {            int count = bcol;            while ( count <= ecol )            {                *( dest + index ) = matrix[brow][count];                count++;                index++;            }                        numbers = numbers + count - bcol;            brow += 1;        }        else if ( times % 4 == 2 )        {            int count = brow;            while ( count <= erow )            {                *( dest + index ) = matrix[count][ecol];                count += 1;                index++;            }                        numbers = numbers + count - brow;            ecol -= 1;        }        else if ( times % 4 == 3 )        {            int count = ecol;            while ( count >= bcol )            {                *( dest + index ) = matrix[erow][count];                count -= 1;                index++;            }                        numbers = numbers + ecol - count;            erow -= 1;        }        else        {            int count = erow;            while ( count >= brow )            {                *( dest + index ) = matrix[count][bcol];                count -= 1;                index++;            }                        numbers = numbers + erow - count;            bcol += 1;        }        times += 1;            }    *( dest + index ) = '\0';        return dest;}