【leetcode】59 螺旋矩阵 ||

题目

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

一些感悟

其实这题没有什么特殊的技巧 一开始我做的时候我以为这样填 数字之间会有关联 后面发现就是按着顺时针的顺序进行填写数字 关键就是用代码没法很好的把顺时针的思路写出来 最一开始我想的是先走完第一行 然后按着三个三个走 两个两个走 一个一个走 就能走完 但是代码就写乱了 因为涉及的变量变化的太多

此题关键点

每次只遍历一条边 每条边的处理逻辑得相同 比如得留出一个元素以供下条边处理
一次循环 则完成一次顺时针 那么n为偶数的话就要n/2个顺时针的圈 可以把元素填完 n为奇数的话 也是n/2个顺时针的圈 但是会漏掉最中间的元素(这个直接所有圈数走完之后 再填写)

实现代码

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
    *returnSize = n;
    *returnColumnSizes = malloc(sizeof(int) * n);
    int** result=(int **)malloc(sizeof(int *)*n);
    for(int i=0;i<n;i++){
        result[i]=(int *)malloc(sizeof(int)*n);
        (*returnColumnSizes)[i] = n;
    } 
    int startindex=0; //每一圈填充的起始位置
    int ignore=1;//每填充一行或者一列会留ignore个元素给下一条边处理
    int number=1,i,j;
    // r为循环填充数字的圈数
    for(int r=n/2;r>0;r--){
        i=startindex,j=startindex;
        //处理从左到右
        for(;j<n-ignore;j++){
            result[i][j]=number++;
        }
        //处理从上到下
        for(;i<n-ignore;i++){
            result[i][j]=number++;
        }
        //处理从右到左
        for(;j>=ignore;j--){
            result[i][j]=number++;
        }
        //处理从下到上
        for(;i>=ignore;i--){
            result[i][j]=number++;
        }
        startindex++;
        ignore++;
    }
    if(n%2!=0){
        result[n/2][n/2]=number;
    }
    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值