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

作者: CrazySteven | 来源:发表于2018-01-14 23:18 被阅读54次

    本周题目难度级别'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 原创出品,欢迎转载,转载时请注明出处!

    相关文章

      网友评论

        本文标题:每周一道算法题(四十一)

        本文链接:https://www.haomeiwen.com/subject/swgloxtx.html