哪些网站专做自媒体的,在重庆 那里可以做诚信网站认证,国内模板建站公司,番禺网络目录 相关题目介绍二维数组的模拟开辟函数参数解读此列题的解题代码 相关题目介绍
最近博主一直再刷Leetcode上有关c语言的题目#xff0c;有些题目第一步就将我卡死了。为什么呢#xff1f;因为题目中所给的函数里的参数的具体含义我既然都不知道是什么意思。当然在请教了一… 目录 相关题目介绍二维数组的模拟开辟函数参数解读此列题的解题代码 相关题目介绍
最近博主一直再刷Leetcode上有关c语言的题目有些题目第一步就将我卡死了。为什么呢因为题目中所给的函数里的参数的具体含义我既然都不知道是什么意思。当然在请教了一些大佬后我也顺利解决了不然也不会有人和你们分享了哈哈哈~ 我就已一个典型的题目来介绍吧题目链接 2373. 矩阵中的局部最大值
int** largestLocal(int** grid, int gridSize, int* gridColSize, int* returnSize, int** returnColumnSizes)
{
}我将从以下几个方面对此题及此类问题进行剖析 1. malloc模拟开辟二维数组 2. 涉及二维数组的题目所给函数中的各个参数的解读 3. 二维数组每一维长度的更新
二维数组的模拟开辟
此题要求返回一个矩阵我们都知道矩阵可以当作一个二维数组来看待。返回的二维数组是需要我们自己创建的即要用malloc函数动态开辟。下面讲解具体思路
使用指针数组 以row*col的数组为例
//动态开辟一个指针数组
int** pArr(int**)malloc(sizeof(int*)*row);
//使row个指针分别指向每次动态开辟的地址
for(int i0;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开辟的地址是随机的但一维数组之间是连续存放的·。
使用数组指针 同样以一个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]所以一般在做题时不使用此创建方法但单纯模拟创建二维数组是没有问题的。此方法动态开辟的二维数组在内存中是连续存放的。
一维数组方式 同样以一个row * col的二维数组为例
int* pArr(int* )malloc(row * col * sizeof(int));相较于上面的两个方法这个就比较鸡肋了既不能直接使用下标访问返回类型也为int*。那他的访问方式是怎样的呢即pArr(i*colj)这里的i代表行数j代表列数这里i * col是为了使i时每次跳过一行。 总结在我们刷Leetcode时涉及需返回矩阵的题目时函数返回类型多为二级指针这时我们就必须使用第一种模拟创建二维数组的方法。
函数参数解读
int** largestLocal(int** grid, int gridSize, int* gridColSize, int* returnSize, int** returnColumnSizes)
{
}下面我将以此函数为例对此函数参数进行剖析
首先看到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};此处gridSize便是指针数组pArr的长度了此长度便可当作是矩阵的行数。 而gridColSize指向的是pArr中指针指向的数组的长度所以*gridColSize便可当作矩阵的列数。 这里的returnSize是我们需要设置的值可以理解为返回的矩阵二维数组的长度即矩阵行数写完代码时我们需解引用*returnSize设置长度。 那么设置完行数就还要设置列数
for(int i0; igridSize; 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 i0;irow-2;i){ans[i](int*)malloc((col-2)*sizeof(int));}for(int i0;irow-2;i){for(int j0;jcol-2;j){int max 0;for(int m0;m3;m)for(int n0;n3;n)max (max grid[im][jn]) ? max : grid[im][jn];ans[i][j] max;} }*returnSize (row-2);*returnColumnSizes malloc((gridSize-2)*sizeof(int));for(int i0; igridSize-2; i){(*returnColumnSizes)[i] gridSize-2;}return ans;
}关于这类题目所给的函数参数大致解释是这样的但可能还会依据题目而变化所以更需要的是我们大量的练习和总结只有这样才能在最短的时间内判断出函数参数的含义。上面的讲解有很多是我自己的理解所以有什么错误还请各位指出感谢