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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据仓库DW-理论知识储备

数据仓库DW 数据仓库具备 采集数据、分析数据、存储数据的功能&#xff0c;最后得出一些有用的数据&#xff0c;一些目标数据来使用。 采集来自不同源的数据&#xff0c;然后对这些数据进行分析和计算得出一些有用的指标&#xff0c;提供数据决策支持。 数据的来源有&#xff…

uniapp-vue3-标签选择器wo-tag

采用uniapp-vue3实现, 是一款支持高度自定义的标签选择器组件&#xff0c;支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id14960 使用示例 <template>&…

使用 GitHub Action 自动更新 Sealos 集群的应用镜像

在 IT 领域&#xff0c;自动化无疑已成为提高工作效率和减少人为错误的关键。Sealos 作为一个强大的云操作系统&#xff0c;已经为许多企业和开发者提供了稳定可靠的服务。与此同时&#xff0c;随着技术不断发展&#xff0c;集成更多的功能和服务变得尤为重要。考虑到这一点&am…

OPENCV图像和视频处理

图像基本操作&#xff1a; Opencv图像处理&#xff08;全&#xff09;_胖墩会武术的博客-CSDN博客 import cv2 import matplotlib.pyplot as plt import numpy as npimgcv2.imread(1.jpg) #图像的显示 cv2.imshow(image,img) cv2.waitKey(0) …

c#画五角星

c#画一个五角星,最重要的就是计算哪些坐标点出来,也是最难的一部分,这要涉及到一些数学方面的知识.对数学坐标知识不是很熟的人,如果想学画图,我建议多去看一下数学书,对我们写程序的人来说是没有什么坏处可言的. 想学习的朋友可以一起学习,我觉得分享学习是一种快乐,所以把自…

【OpenCV-PyQt5-PyGame-imutils】探索Python中的图像和视频捕获:性能分析与选择指南

前言 随着计算机视觉和多媒体应用的不断发展&#xff0c;图像和视频捕获变得越来越重要。在Python中&#xff0c;有多种库和工具可供选择&#xff0c;用于打开摄像头、捕获图像、以及处理视频流。本文旨在为读者提供对这些捕获方法的全面了解&#xff0c;并介绍如何计算平均帧…

bindtap和catchtap的区别?

bindtap和catchtap都是小程序中用于绑定点击事件的方法。 1.bindtap的作用是绑定一个触摸事件并指定对应的处理函数。当用户点击或触摸相关元素时&#xff0c;会触发该事件&#xff0c;并执行相应的处理逻辑。 示例&#xff1a; <button bindtap"handleTap">…

测试自动化的边缘:DevTestOps 和 DevSecOps

什么是 DevOps&#xff1f; DevOps 允许企业通过自动化基础设施、工作流程和持续测量应用程序的性能来提高开发人员和运营团队之间的协作和生产力。通过 DevOps&#xff0c;开发人员可以以小块的形式编写代码&#xff0c;以便在几个小时内集成、测试、监控和部署代码&#xff…

02 stm32-hal库 timer 基本定时器设定

1.配置始终时钟参数 >2. 初始化 MX_TIM3_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim3);> 3.增加回调函数 4 中断服务函数 void TIM3_IRQHandler(void) {/* USER CODE BEGIN TIM3_IRQn 0 *//* USER CODE END TIM3_IRQn 0 */HAL_TIM_IRQHandler(&…

jupyter 切换虚拟环境

当前只有两个环kernel 我已经创建了很多虚拟环境&#xff0c;如何在notebook中使用这些虚拟环境呢&#xff1f;请看下面 比如说我要添加nlp 这个虚拟环境到notebook中 1. 切换到nlp环境 2. 安装如下模块 pip install ipykernel 3. 执行如下命令 python -m ipykernel install …

循环外声明变量和循环内声明变量的区别

在for循环外部声明变量&#xff0c;for循环内部给变量赋值&#xff0c;能减少变量的声明&#xff0c;看上去似乎很有道理&#xff0c;其代码如下&#xff1a; public class MainTest {public static void main(String[] args){Object o;for (int i 0; i < 10; i) {o new …

【Leetcode】210.课程表II

一、题目 1、题目描述 现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 p r e r e q u i s i t e s [ i ] = [ a i , b i

半监督学习介绍(为什么半监督学习是机器学习的未来)

文章目录 半监督学习的好处半监督学习原理半监督范式总结 半监督学习是一种利用标记和未标记数据的机器学习方法。半监督学习的目标是结合监督学习和无监督学习的优点&#xff1b;利用标记数据的准确性以及未标记数据的丰富性和较低成本。半监督学习可以被认为是 监督学习&…

EF Core中的拆分查询策略

概要 从EF Core 5.0中&#xff0c;引入了拆分查询策略&#xff0c;该策略可以显著的提升多表查询的效率。本文主要介绍该策略的使用场景和基本使用方法。 代码和实现 使用场景 该策略主要使用在涉及多表连接查询的场景。本例的场景是这样&#xff0c;一个银行分行拥有多个设…

【通义千问】大模型Qwen GitHub开源工程学习笔记(4)-- 模型的量化与离线部署

摘要: 量化方案基于AutoGPTQ,提供了Int4量化模型,其中包括Qwen-7B-Chat和Qwen-14B-Chat。更新承诺在模型评估效果几乎没有损失的情况下,降低存储要求并提高推理速度。量化是指将模型权重和激活的精度降低以节省存储空间并提高推理速度的过程。AutoGPTQ是一种专有量化工具。…

[每周一更]-(第67期):docker-compose 部署php的laravel项目

容器化部署laravel框架的php项目 操作步骤 参考&#xff1a; https://www.cnblogs.com/jingjingxyk/p/16842937.htmlhttps://developer.aliyun.com/article/708976 0、plv项目修改 composer install.env 修改后台地址 IP:端口chmod -R 777 public / chmod -R 777 storagevi…

Mac删除不在程序坞的程序

现象描述&#xff1a;删除某个程序时&#xff08;通过‘程序’列表中将该应用移动到废纸篓里&#xff09;&#xff0c;该应用程序正在运行中&#xff0c;删除过程该程序未提示正在运行中&#xff0c;仅仅删除了图标&#xff08;在此吐槽下该程序的交互&#xff0c;产品没有考虑…

*常用函数

文章目录 nn.PReLU() 激活函数 nn.PReLU() 激活函数 PReLU(Parametric Rectified Linear Unit), 顾名思义&#xff1a;带参数的ReLU 其中a代表的是可学习的参数 ReLU、PReLU的比较&#xff1a; 如果ai0&#xff0c;那么PReLU退化为ReLU&#xff1b; 如果ai是一个很小的固定…

Git Commit Message规范

概述 Git commit message规范是一种良好的实践&#xff0c;可以帮助开发团队更好地理解和维护代码库的历史记录。它可以提高代码质量、可读性和可维护性。下面是一种常见的Git commit message规范&#xff0c;通常被称为"Conventional Commits"规范&#xff1a; 一…

Windows下DataGrip连接Hive

DataGrip连接Hive 1. 启动Hadoop2. 启动hiveserver2服务3. 启动元数据服务4. 启动DG 1. 启动Hadoop 在控制台中输入start-all.cmd后&#xff0c;弹出下图4个终端&#xff08;注意终端的名字&#xff09;2. 启动hiveserver2服务 单独开一个窗口启动hiveserver2服务&#xff0c;…