剑指面试题29. 顺时针打印矩阵 (算法解析和代码讲解)

1:算法解析

        算法如图,从矩阵的(0,0)开始,向右至此行最右边有效的节点,则向右处理行(最小行号)结束;

                           从下一行的列节点开始,向下至此列最下边有效的节点,则向下处理列(最大列号)结束;

                           从此行的左边节点开始,向左至此行最左边有效的节点,则向左处理行(最大行号)结束;

                           从上一行的行节点开始,向上至此列最上边有效的节点,则向上处理列(最小列号)结束;

         若任一个方向没有需要处理的数值,则算法结束,否则修改行或列有效值,继续循环。

                                          

2:代码讲解

       2.1:无效判断中,matrix的相关判断应该放在行或列的判断之后,不然测试例为[]时,matrix==NULL,*matrix会出现错误。

       2.2:为提高程序可读性,用row/col代表有效的最小行号/列号,rows/cols代表有效的最大行号/列号,tmpr/tmpc介于有效最大最小行/列值之间,为赋值所用。

       2.3:二层while的条件代表仍有元素需要处理,一旦任意一个二层while的条件无法满足,即达到算法结束条件。

       2.4:每个方向处理完之后,下一个方向的处理节点不应该与该方向有重合,即注意每个方向的起始点的行号和列号。

3:详细代码

int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
    if (matrixSize <= 0 || matrixColSize == NULL || *matrixColSize <= 0
        || matrix == NULL || *matrix == NULL) {
        if (returnSize != NULL)
            *returnSize = 0;
        return;
    }

    *returnSize = *matrixColSize*matrixSize;
    int* res = (int *)calloc(*returnSize, sizeof(int));

    int index = 0;
    int rows = matrixSize - 1, cols = *matrixColSize - 1;
    int row = 0, col = 0;
    int tmpr = row, tmpc = col;
    while (1) {
        if (tmpc > cols)  break;
        while (tmpc <= cols)                   //向右
            res[index++] = matrix[row][tmpc++];

        tmpr = ++row;
        if (tmpr > rows) break;
        while (tmpr <= rows)                   //向下
            res[index++] = matrix[tmpr++][cols];
        
        tmpc = --cols;
        if (tmpc < col)  break;
        while (tmpc >= col)                   //向左
            res[index++] = matrix[rows][tmpc--];

        tmpr = --rows;
        if (tmpr < row)  break;
        while (tmpr >= row)                    //向上
            res[index++] = matrix[tmpr--][col];

        tmpc = ++col;
    }

    return res;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值