59.螺旋矩阵II---DAY2

该文章探讨了如何将大问题分解为小问题来解决,以生成螺旋矩阵为例,详细解释了算法的核心思想。在绘制矩阵过程中,文章指出了外圈和内圈矩阵绘制的难点,以及如何将外圈算法应用于内圈。同时,文章提供了具体的代码实现,包括设置起始位置、循环次数、偏移量等关键步骤,并处理了奇数大小矩阵的特殊情况。
摘要由CSDN通过智能技术生成

思想:把一个大问题拆解成相似的小问题——》画螺旋矩阵的本质就是画一个个正方形。最后判断中间需不需要加上一个单独的值(非得要加上单独的只是因为loop=n除以2;就算把loop改成loop=n/2+1后,由于for循环里面都是j < startY + n - offset这种大于和小于的判断条件,而不是大于等于or小于等于,所以把loop改成n/2+1后也没有用)

难点:小问题之间的连贯性和转化(也就是解决了外圈矩阵的绘制后,如何把解决外圈的这一套算法放到解决内圈矩阵的绘制中)

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
    *returnSize = n;//要返回的数组中有多少个数字
    *returnColumnSizes = (int*)malloc(sizeof(int) * n);
    //初始化返回结果数组ans;ans是个二维数组
    int** ans = (int**)malloc(sizeof(int*) * n);
    int i;
    for(i = 0; i < n; i++) {
        ans[i] = (int*)malloc(sizeof(int) * n);
        (*returnColumnSizes)[i] = n;
    }
    //设置每次循环的起始位置
    int startX = 0;
    int startY = 0;
    //设置二维数组的中间值,若n为奇数。需要最后在中间填入数字
    int mid = n / 2;
    //循环圈数-->每转一圈到里面一圈时,矩阵的长和宽后会减2
    int loop = n / 2;
    //偏移数
    int offset = 1;
    //当前要添加的元素
    int count = 1;

    while(loop) {
        int i = startX;
        int j = startY;
        //模拟上侧从左到右
        for(; j < startY + n - offset; j++) {
            ans[startX][j] = count++;
        }
        //模拟右侧从上到下
        for(; i < startX + n - offset; i++) {
            ans[i][j] = count++;
        }
        //模拟下侧从右到左
        for(; j > startY; j--) {
            ans[i][j] = count++;
        }
        //模拟左侧从下到上
        for(; i > startX; i--) {
            ans[i][j] = count++;
        }
        //偏移值每次加2
        offset+=2;
        //遍历起始位置每次+1
        startX++;
        startY++;
        loop--;
    }
    //若n为奇数需要单独给矩阵中间赋值
    if(n%2)
        ans[mid][mid] = count;

    return ans;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值