详解Leetcode中关于malloc模拟开辟二维数组问题,涉及二维数组的题目所给函数中的各个参数的解读

简介: 详解Leetcode中关于malloc模拟开辟二维数组问题,涉及二维数组的题目所给函数中的各个参数的解读

相关题目介绍

最近博主一直再刷Leetcode上有关c语言的题目,有些题目第一步就将我卡死了。为什么呢?因为题目中所给的函数里的参数的具体含义我既然都不知道是什么意思。当然在请教了一些大佬后我也顺利解决了,不然也不会有人和你们分享了,哈哈哈~

我就已一个典型的题目来介绍吧:题目链接: 2373. 矩阵中的局部最大值

int** largestLocal(int** grid, int gridSize, int* gridColSize, int* returnSize, int** returnColumnSizes)
{
}

1. malloc模拟开辟二维数组
2. 涉及二维数组的题目所给函数中的各个参数的解读
3. 二维数组每一维长度的更新

二维数组的模拟开辟

此题要求返回一个矩阵,我们都知道矩阵可以当作一个二维数组来看待。返回的二维数组是需要我们自己创建的,即要用malloc函数动态开辟。下面讲解具体思路:

  1. 使用指针数组
    row*col的数组为例
//动态开辟一个指针数组
int** pArr=(int**)malloc(sizeof(int*)*row);
//使row个指针分别指向每次动态开辟的地址
for(int i=0;i < col;i++)
{
    pArr[i] = (int*)malloc(sizeof(int)*col);
}

首先malloc动态开辟一个数组指针,其大小为row * sizeof(int*),row代表想开辟二维数组的行数,sizeof(int*)便是每个指针的大小;我们都知道一维数组名其实都是一个指向首元素的地址,那么我们就可以每次开辟一个长度为col的一维数组,并将首地址赋给pArr[i]这样我们同样可以使用pArr[i][j]调用第i行第j列的元素。

但是有一点需要注意这种方法模拟开辟的二维数组的每行之间并不是连续存放的,因为每次malloc开辟的地址是随机的,但一维数组之间是连续存放的·。

  1. 使用数组指针
    同样以一个row * col的二维数组为例
int(*pArr)[col]=(int(* )[row])malloc(row * col * sizeof(int))

首先malloc直接动态开辟整个二维数组的大小,并将返回值强转为int(* )[col],这样每当pArr加一操作时,跳过的就是一个长度为col的一维数组吗。那么想要访问二维数组第i行,第j列就可以使用pArr[i][j]来实现。

同样需要注意的是pArr的类型为int(* )[col]所以一般在做题时不使用此创建方法,但单纯模拟创建二维数组是没有问题的。此方法动态开辟的二维数组在内存中是连续存放的

  1. 一维数组方式
    同样以一个row * col的二维数组为例
int* pArr=(int* )malloc(row * col * sizeof(int));

相较于上面的两个方法这个就比较鸡肋了,既不能直接使用下标访问,返回类型也为int*。那他的访问方式是怎样的呢?即:pArr(i*col+j)这里的i代表行数,j代表列数,这里i * col是为了使i++时每次跳过一行。


总结:在我们刷Leetcode时涉及需返回矩阵的题目时,函数返回类型多为二级指针,这时我们就必须使用第一种模拟创建二维数组的方法。

函数参数解读

int** largestLocal(int** grid, int gridSize, int* gridColSize, int* returnSize, int** returnColumnSizes)
{
}

下面我将以此函数为例,对此函数参数进行剖析:

  1. 首先看到grid,这是一个二级指针,经过上面介绍,不难发现此指针指向了一个指针数组(也可以当作是二维数组)。但是并不是直接创建的二维数组,形如:int pArr[row][col],因为我们知道如果传pArr时,grid类型就是int*了,与题不符,而且不能使用下表直接访问元素。所以在函数外部创建的数组大致如下:
//以2 * 2的矩阵为例
int arr1[2] = {1,2};
int arr2[2] = {3,4};
int* pArr[2] = {arr1,arr2};
  1. 此处gridSize便是指针数组pArr的长度了,此长度便可当作是矩阵的行数
  2. gridColSize指向的是pArr指针指向的数组的长度,所以*gridColSize便可当作矩阵的列数
  3. 这里的returnSize是我们需要设置的值,可以理解为返回的矩阵(二维数组)的长度,即矩阵行数,写完代码时我们需解引用*returnSize设置长度。
  4. 那么设置完行数,就还要设置列数,
for(int i=0; i<gridSize; i++)//gridSize行
{
    (*returnColumnSizes)[i] = gridSize;//每行设为grid列
}

此列题的解题代码

int** largestLocal(int** grid, int gridSize, int* gridColSize, int* returnSize, int** returnColumnSizes)
{
    int row = gridSize;
    int col = *gridColSize;
    int** ans=(int**)malloc((row-2)*sizeof(int*));
    for(int i=0;i<row-2;i++)
    {
        ans[i]=(int*)malloc((col-2)*sizeof(int));
    }
    for(int i=0;i<row-2;i++)
    {
        
        for(int j=0;j<col-2;j++)
        {
            int max = 0;
            for(int m=0;m<3;m++)
                for(int n=0;n<3;n++)
                    max = (max > grid[i+m][j+n]) ? max : grid[i+m][j+n];
            ans[i][j] = max;
        }    
    }

    *returnSize = (row-2);
    *returnColumnSizes = malloc((gridSize-2)*sizeof(int));
    for(int i=0; i<gridSize-2; i++)
    {
        (*returnColumnSizes)[i] = gridSize-2;
    }
    return ans;
}

关于这类题目所给的函数参数大致解释是这样的,但可能还会依据题目而变化,所以更需要的是我们大量的练习和总结,只有这样才能在最短的时间内判断出函数参数的含义。上面的讲解有很多是我自己的理解,所以有什么错误还请各位指出,感谢!!!

目录
相关文章
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 04. 二维数组中的查找
剑指Offer题目 "二维数组中的查找" 的Python解决方案,包括非递归迭代、递归以及使用内置函数的二分查找方法,以判断一个有序的二维数组中是否含有给定整数。
29 1
|
1月前
|
算法
LeetCode第12题目整数转罗马数字
该文章介绍了 LeetCode 第 12 题整数转罗马数字的解法,通过使用 TreeMap 按照整数从大到小排序,先使用大的罗马数字表示整数,再用小的,核心是先表示完大的罗马数字,想通此点该题较简单。
LeetCode第12题目整数转罗马数字
|
1月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
38 6
|
1月前
|
算法
LeetCode第13题目罗马数字转整数
该文章介绍了 LeetCode 第 13 题罗马数字转整数的解法,通过从大到小解析罗马数字,根据罗马数字的特点,按照从大到小的顺序匹配罗马数字和整数的关系,从而解决该问题,同时强调要注意观察题目考查的知识点特征。
|
2月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
3月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
3月前
|
容器
【LeetCode刷题】栈和队列题目练习~
【LeetCode刷题】栈和队列题目练习~
【42页动态规划学习笔记分享】动态规划核心原理详解及27道LeetCode相关经典题目汇总(4)
【42页动态规划学习笔记分享】动态规划核心原理详解及27道LeetCode相关经典题目汇总
|
3月前
|
存储 算法
【42页动态规划学习笔记分享】动态规划核心原理详解及27道LeetCode相关经典题目汇总(1)
【42页动态规划学习笔记分享】动态规划核心原理详解及27道LeetCode相关经典题目汇总
|
3月前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成