leetcode54螺旋矩阵

题目

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

解题思路:常规思路即可破题。

int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
    if(!matrixSize){*returnSize=0;return NULL;}
    int i=0,j=0,n=0;//i,j当前行列 n当前已有的returnsize大小
    int LeftEdge=0,RightEdge=0,UpEdge=1,DownEdge=0;
    int dir=0;//0-向左 1-向下 2-向右 3-向上
    *returnSize=matrixSize*(*matrixColSize);
    //初始化返回数组并为其分配大小
    int*ret=(int*)malloc(sizeof(int)*(*returnSize));
    while(n<*returnSize)
    {
        //printf("[%d,%d] ",i,j);
        ret[n]=matrix[i][j];
        n++;
        if(dir==0)j++;
        else if(dir==1)i++;
        else if(dir==2)j--;
        else if(dir==3)i--; 
        if(dir==0&&j==*matrixColSize-RightEdge)
        {//到达右边边界时,方向改成向下移动
            j--;
            i++;
            dir=1;
            RightEdge++;
        }
        if(dir==1&&i==matrixSize-DownEdge)
        {//到达下边边界时,方向改成向左移动
            i--;
            j--;
            dir=2;
            DownEdge++;
        }
        if(dir==2&&j==LeftEdge-1)
        {//到达左边边界时,方向改成向上移动
            j++;
            i--;
            dir=3;
            LeftEdge++;
        }
        if(dir==3&&i==UpEdge-1)
        {//到达上边边界时,方向改成向右移动
            i++;
            j++;
            dir=0;
            UpEdge++;
        }
    }
    return ret;
}

这道题做了两天才做出来,一直卡在传入值为空数组([]),如何返回指针的问题上。
一直想通过判断* returnSize为零,来返回指针。

遇到的问题:
1.不知道要return NULL,还以为是return 0
记住:指针返回地址!!!
2.一直在判断matrixSize*(*matrixColSize)==0是不是成立,一直没跑通。现在也没想通是为什么,可能matrixSize为0的时候,matrixColSize 为空指针?

if(!matrixSize){returnSize=0;return NULL;}
成功跑通!

结论就是指针还不熟悉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值