[LeetCode]54. Spiral Matrix

发布时间:2020-07-23 02:34:10 作者:風子余
来源:网络 阅读:753

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  3
4  5  6
7  8  9
螺旋排序后的结果为:1,2,3,6,9,8,7,4,5
由此可知读取共分四个方向,而且是四个方向的轮回:
1)从左到右(横坐标不变,纵坐标逐步加一)。读取结果为:1 2 3
2)从上到下(纵坐标不变,横坐标逐步加matrixColSize)。读取结果为:6 9
3)从右往左(横坐标不变,纵坐标逐步减一)读取结果为:8 7
4)从下往上(纵坐标不变,横坐标逐步减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;
}





推荐阅读:
  1. CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
  2. mysql source code源代安装的前提条件requirement

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

code leet tc

上一篇:ELK7.3.1 单台部署elasticsearch和kibana

下一篇:react完全控制与不完全控制的区别

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》