【LeetCode 05】螺旋矩阵II总结

简介: 【LeetCode 05】螺旋矩阵II总结

一、题意:

二、解题步骤

step1:初始化数组的大小、行数、列数、一维数组的大小

题目中参数说明:

returnColumnSizes多见于存在二维矩阵的地方。

问:returnColumnSizes是什么?

答:一个一维数组的地址的地址。(地址即指针,后同)

  • n:矩阵阶数
  • *returnSize:矩阵行数
  • **returnColumnSizes每一行矩阵的元素个数(列数)
returnColumnSizes 是一维数组的地址的地址
* returnColumnSizes   是一维数组的地址
(* returnColumnSizes)[i]  是一维数组的i个元素

代码:

*returnSize=n;
*returnColumnSizes=(int *)malloc(sizeof(int)*n);
int **ans=(int **)malloc(sizeof(int*)*n);//动态数组开辟内存空间
for(int i=0;<n;i++){数组空间初始化
  ans[i]=(int *)malloc(sizeof(int)*n);
  (*returnColumnSizes)[i]=n;//一维数组的大小
}

step2:设置转圈起始点、二维数组中间值、循环圈数、偏移数、需要添加值

NOTE:

偏移数:offset表示每一圈的每一条边的长度,用 startX+n-offset表示控制这个长度

需要添加值:每一个矩阵块的新添加值

//设置每次循环的起始位置
    int startX = 0;
    int startY = 0;
    //设置二维数组的中间值,若n为奇数。需要最后在中间填入数字
    int mid = n / 2;
    //循环圈数
    int loop = n / 2;
    //偏移数
    int offset = 1;
    //当前要添加的元素
    int count = 1;

step3:画圈遵循循环不变量------“左闭右开”

  • 从左到右填上行
  • 从上到下填右行
  • 从右到左填下行
  • 从下到上填左行

    左闭右开:
int i=startx;
int j=starty;
for(j=starty;j<starty+n-offset;j++){//从左到右填上行 左闭右开
    ans[startx][j]=count++;
}
for(i=startx;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++;
}

step4:临界值的改变

offset+=2;
startx++;
starty++;
loop--;
if(n%2!=0)
    ans[mid][mid]=count;
return ans;

完整代码:

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
   //初始化返回的结果数组的大小
    *returnSize = n;
    *returnColumnSizes = (int*)malloc(sizeof(int) * n);
    //初始化返回结果数组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;
    //循环圈数
    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[i][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;
}


目录
相关文章
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
77 0
|
2月前
|
C++
Leetcode第54题(螺旋矩阵)
这篇文章介绍了LeetCode第54题“螺旋矩阵”的解题思路和C++的实现代码,该题目要求按照顺时针螺旋顺序返回给定矩阵中的所有元素。
20 1
Leetcode第54题(螺旋矩阵)
|
4月前
|
算法
LeetCode第59题螺旋矩阵 II
LeetCode第59题"螺旋矩阵 II"的解题方法,通过模拟螺旋填充过程,一圈一圈从外到内按顺序填充数字,直到完成整个矩阵的构建。
LeetCode第59题螺旋矩阵 II
|
4月前
|
存储 算法
LeetCode第54题螺旋矩阵
LeetCode第54题"螺旋矩阵"的解题方法,通过模拟从外到内的螺旋遍历过程,并利用方向向量控制遍历方向的转换,有效输出矩阵的螺旋顺序。
LeetCode第54题螺旋矩阵
|
机器学习/深度学习 算法
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
59 0
|
6月前
leetcode54螺旋矩阵题解
leetcode54螺旋矩阵题解
33 2
|
6月前
|
算法 机器人 数据挖掘
LeetCode题目54:螺旋矩阵【python4种算法实现】
LeetCode题目54:螺旋矩阵【python4种算法实现】
|
6月前
|
存储 算法
力扣经典150题第三十五题:螺旋矩阵
力扣经典150题第三十五题:螺旋矩阵
23 0
|
7月前
leetcode-6111:螺旋矩阵 IV
leetcode-6111:螺旋矩阵 IV
45 0
|
7月前
|
Java C++ Python
leetcode-59:螺旋矩阵 II
leetcode-59:螺旋矩阵 II
36 0