C语言刷代码随想录--螺旋矩阵2.0

2024-01-09 12:29:54

原题LeetCode链接:. - 力扣(LeetCode)

这是一道纯粹的模拟题,基本思路为:

1.分层次从左到右、从上到下、从右到左、从下到上依次进行进行填充;循环次数为n/2

2.n为奇数,则中间需要填充最后一个数(偶数正好最后一个循环填满)

循环模拟题需要确定边界,题解确定为左闭右开的原则,逐层遍历

代码如下:

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
    *returnSize=n;//返回数组一维大小
    *returnColumnSizes=(int*)malloc(sizeof(int)*n);//二维大小

    int** res=(int**)malloc(sizeof(int*)*n);//结果数组n列
    for(int i=0;i<n;i++){
        res[i]=(int*)malloc(sizeof(int)*n);//n行
        (*returnColumnSizes)[i]=n;//结果每行n维
        }
    int count=1;
    //遍历要求:左闭右开
    for(int loop=0;loop<n/2;loop++){
        for(int i=loop;i<n-1-loop;i++)
            res[loop][i] = count++;//从左到右
        for(int i=loop;i<n-loop-1;i++)
            res[i][n-1-loop]=count++;//从上到下
        for(int i=loop;i<n-loop-1;i++)
            res[n-loop-1][n-i-1]=count++;//从右到左
        for(int i=loop;i<n-loop-1;i++)
            res[n-i-1][loop]=count++;//从下到上
    }

    if(n%2==1)
        res[n/2][n/2]=count;//奇数则填入最后一个数字
    return res;
}

总结:所有循环模拟题,最重要的就是确认边界,尽可能确保每一次循环所干的事情相同,且最终能够完全模拟结果

文章来源:https://blog.csdn.net/m0_52169264/article/details/135436555
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。