详解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;
}

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

到了这里,关于详解Leetcode中关于malloc模拟开辟二维数组问题,涉及二维数组的题目所给函数中的各个参数的解读的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaSE】一维数组和二维数组详解

    欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 一维数组 基本语法 初始化 遍历和打印 数组是引用型变量 基本类型变量与引用类型变量的区别 null 数组传参和返回 总结 二维数组 基本语法 初始化 遍历和打印 数组:可以看成是相同类型元素的

    2024年04月09日
    浏览(44)
  • c++二维数组详解

    一、二维数组的定义 假如我们要保存100个整数,我们可以使用一维数组,定义数组int a[100],然后就可以把这100个整数保存在数组的a[0],a[1],......a[99]。 假如我们有3行,每行有4个整数,应该如何保存呢? 每行使用一个一维数组是可以的,例如:第一行使用数组int a[4],第二行使

    2024年02月06日
    浏览(43)
  • 27从零开始学Java之详解复杂的二维数组与多维数组

    作者 :孙玉昌,昵称【 一一哥 】,另外【 壹壹哥 】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 在前几篇文章中, 壹哥 给大家介绍了Java里的一维数组,涉及到了数组的创建初始化、数组遍历、拷贝、扩容、排序、查找等核心

    2024年02月02日
    浏览(43)
  • 从二维数组到一维数组——探索01背包问题的动态规划优化

    本文将继续上一篇博客爬楼梯之后继续讲解同样用到了动态规划的 01背包问题 在解决动态规划问题时,我们经常面临着空间复杂度的挑战。01背包问题是一个典型的例子,通常使用二维数组来表示状态转移,但这样会带来额外的空间开销。在本文中,我们将探讨如何通过优化

    2024年04月11日
    浏览(60)
  • 【C进阶】分析 C/C++程序的内存开辟与柔性数组(内有干货)

            本文是对于动态内存管理知识后续的补充,以及加深对其的理解。对于动态内存管理涉及的大部分知识在这篇文章中 ---- 【C进阶】 动态内存管理_Dream_Chaser~的博客-CSDN博客         本文涉及的知识内容主要在两方面: 简单解析C/C++程序的内存开辟 分析柔性数组

    2024年02月09日
    浏览(42)
  • 【C++入门】学习使用二维数组基本知识及用法详解

    🧛‍♂️iecne个人主页: : iecne的学习日志 💡每天 关注 iecne的作品,一起进步 💪一起学习,必看iecne 🐳希望大家多多支持🥰一起进步呀! 二维数组就是在一维数组上多加一个维度。 建议:以下三种定义方式,利用第二种更加直观,提高代码可读性 第二种就是在定义一

    2024年01月25日
    浏览(55)
  • C语言问题 - 关于一维数组和二维数组用*a+i形式表达

    今天在编写程序时被一个语句搞懵了: 输出结果: 把我搞懵的是*(pa + k) = *(a + i) + j; (其实真的很简单的道理还一直在纠结。。。) 其实这句话就是指(对等号左右边语句分别解释): 每次循环 pa+k都会让pa指针都会向下移动一格,而加上星号*就是为了取指针所指的值,而

    2024年02月11日
    浏览(41)
  • 【C语言数组】一维数组,二维数组详解,数组传参,变长数组,这篇文章让你更全面的认识数组。

    前言: 大家好,我是 良辰丫 💞,今天带大家全面认识一下C语言里面的 数组 ,大家是不是满怀期待呢?嘿嘿嘿,别着急,我们往下看,感受C语言数组的魅力!!!💌💌💌 要么出众,要么出局。💝 乾坤未定,💟你我皆是黑马。 保存一组成绩的数据,数据多的时候难道要

    2024年01月19日
    浏览(55)
  • 杨辉三角的问题,借助二维数组的方法来解决。

      题目:杨辉三角的变形,由原来的等腰三角形变成直角三角形,但规律还是没有发生改变,所以我们还是按照原来的题目做。 根据题目分析发现三角形的第一列和每一行的最后一个都是数值1,那我们根据这个使用循环来把这些地方的值赋值为1;

    2024年02月04日
    浏览(33)
  • 【数据结构】二维数组的行优先、列优先存储问题

    今天同学问我一道感觉很基础的数据结构问题,虽然答案做对了,但是原理一直比较迷,仔细看了一下题,原来是自己把自己绕进去了。。。在此记录一下,大佬如果有更好的方法,可以在评论区留言,不定期更新。 先给出行优先和列优先的计算公式: 设数组为A[m][n]( m 行

    2024年02月10日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包