每周一道算法题(四十一)

本周题目难度级别'Medium',使用语言C

题目:给你一个矩阵(C里面就是二维指针),让你螺旋式遍历。eg:给你矩阵:[[1,2,3],[4,5,6],[7,8,9]],螺旋式遍历的结果:[1,2,3,6,9,8,7,4,5]

思路:如果还没理解题目的话,就按照矩阵的格式写在纸上,然后你顺时针螺旋式遍历就行了,我的思路就是顺时针上->右->下->左的转着圈圈遍历即可。具体看代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* spiralOrder(int** matrix, int matrixRowSize, int matrixColSize) {
    //如果是空指针
    if (matrixRowSize == 0) return 0;
    //初始化容器
    int size = matrixRowSize * matrixColSize;
    int *result = malloc(sizeof(int) * size);
    for (int i = 0; i < size; i++) {
        result[i] = 0;
    }
    //遍历的下标
    int index = 0;
    //循环的次数
    int count = 0;
    while (index < size -1 || size < 3) {
        //正向遍历一行
        for (int i = count; i < matrixColSize-count; i++) {
            result[index++] = matrix[count][i];
        }
        //只有一行就返回结果
        if ((matrixRowSize-count-count) == 1 ) return result;
        //遍历右边一列(从第二行开始,到倒数第二行结束)
        for (int i = 1+count; i < matrixRowSize-count - 1;i++) {
            result[index++] = matrix[i][matrixColSize-count - 1];
        }
        //遍历下面一行
        for (int i = count; i < matrixColSize-count; i++) {
            result[index++] = matrix[matrixRowSize -count- 1][matrixColSize -1-i];
        }
        //如果只有两行或只有一列就返回结果
        if (matrixRowSize-count-count == 2 || matrixColSize-count-count == 1) return result;
        //遍历左边一列(从倒数第二行开始,到第二行结束)
        for (int i = 1+count; i < matrixRowSize-count - 1;i++) {
            result[index++] = matrix[matrixRowSize-1-i][count];
        }
        count++;
    }
    //如果是基数位则添加最后一个数字
    if (index == size -1) result[size -1] = matrix[matrixRowSize / 2][matrixColSize / 2];
    return result;
}

效率嘛,用C的人太少,可参照示例太少,但从复杂度角度来看肯定有更高效的,写C的唯一好处就是让你对内存管理方面更加清晰,因为其他的语言对内存管理已经做的很好了,你基本不用去考虑太多,但C不同,你要去开辟空间,释放空间、处理MUNMAP_CHUNK()、“对齐”等很多问题,比如这道题我剪枝返回matrix[0]都出现了内存问题。。。

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

你可能感兴趣的:(每周一道算法题(四十一))