算法每日一题——第四天——将一维数组转化为二维数组

简介: 算法每日一题——第四天——将一维数组转化为二维数组


这个题的思路很简单,但是如果用C语言来写的话,代码理解还是有一些难度的。

在力扣上,这道题给的接口如下:

我第一次在力扣上完成二维数组的题的时候,看见这些参数也是一脸懵,下面我来解析一下。

(1)int* original —— 这是题目给的数组。

(2)int originalSize —— 这是数组 original 的大小。

(3)int m, int n —— 这时所要化成二维数组的行和列。

(4)int * returnSize —— 这是通过指针的形式返回二维数组的行数。你可以想象在main函数中,将一个数的地址传到该函数中,你的任务就是把二维数组的行数赋值给 returnSize 所指向的空间从而通过传址的方式改变main函数中的值。

(5)int** returnColumnSizes —— 这是一个二级指针,这个题想让你把二维数组每一行的元素也返回去,如果有m行,那么就要返回m个值,所以需要以一个一维数组的形式将它返回去。你可以这样想象,想让这个函数返回一个一维数组到mian函数中,你第一时间想的肯定是在main函数中将一个一维数组的地址传进该函数中,但是这样肯定是不行的。因为你不知道二维数组有多少行,也就是说你不知道这个一维数组有多大。所以你只能传一个一级指针的地址到该函数中,在这个函数中需要拿一个二级指针来接收。你需要完成的任务就是在该函数中根据二维数组的行数,为这个一级指针开辟一块儿空间 即:

*returnColumnSizes = (int *) malloc (sizeof(int)* m);

然后,给这个空间里面赋值。(操作很简单,不在进行讲述)

接下来我们再说一说如何返回一个二维数组吧。

(1)如果直接在函数中定义一个二维数组,最后将它返回,这样写对吗?很显然这样不对,因为在该函数中定义一个二维数组是在栈区开辟的一块儿空间,只要走出了这个函数,这块儿空间就会被释放掉。所以我们不能在栈区开辟空间,要在堆区开辟空间,即通过malloc,calloc,realloc。

(2)首先我们需要定义一个二级指针(二维数组名),进行第一次空间开辟,所开辟的空间是用来存放一级指针(一维数组即每一行的地址),开辟如下:

int**arr=(int**)malloc(sizeof(int*)*m);

(3)下来我们要进行第二次空间开辟,这次开辟是为一级指针开辟空间,用来存放每一行的元素,所以有m行,就要开辟m次,每一次的开辟如下:

arr[i]=(int *)malloc(sizeof(int)*n);

这道题完整代码,如下:

int** construct2DArray(int* original, int originalSize, int m, int n, int* returnSize, int** returnColumnSizes)
{
    int count=0;
    if(m*n!=originalSize)
    return NULL;
    int**arr=(int**)malloc(sizeof(int*)*m);
    *returnSize=m;
    *returnColumnSizes=(int*)malloc(sizeof(int)*m);
    for(int i=0;i<m;i++)
    {
        arr[i]=(int *)malloc(sizeof(int)*n);
       (*returnColumnSizes)[i]=n;
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            arr[i][j]=original[count];
            count++;
        }
    }
    return arr;
}
相关文章
|
6天前
|
算法 测试技术
【算法】二分算法——寻找旋转排序数组中的最小值
【算法】二分算法——寻找旋转排序数组中的最小值
|
6天前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
2月前
|
存储 算法 Go
算法学习:数组 vs 链表
算法学习:数组 vs 链表
36 0
|
4天前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
6天前
|
算法
【算法】模拟算法——外观数组(medium)
【算法】模拟算法——外观数组(medium)
|
6天前
|
算法
【算法】前缀和——除自身以外数组的乘积
【算法】前缀和——除自身以外数组的乘积
|
6天前
|
算法
【算法】前缀和——寻找数组的中心下标
【算法】前缀和——寻找数组的中心下标
|
11天前
|
算法 Java 索引
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
22 0
|
11天前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
10 0
|
2月前
|
存储 算法 调度
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问

热门文章

最新文章