身高排队,不是你想的那么简单——力扣“按身高排序”题解分析

在这里插入图片描述

本篇博客会讲解力扣“2418. 按身高排序”的解题思路,这是题目链接。

在这里插入图片描述
想要排序身高数组是非常简单的。我们在对身高数组进行排序时,会进行一些操作,比如交换2个元素等等。本题中,相当于我们要“记住”排序身高数组中进行了哪些操作,对名字数组进行同样的操作。应该如何进行呢?

一种简单的想法是:可以把2个数组进行某种形式的“绑定”。一开始,2个数组相同下标的元素是一一对应的关系,一个名字对应着一个身高,我们可以把名字和身高绑定在一块,对身高排序的同时也对名字排序,这样就实现了题目要求的效果。

具体的“绑定”方法,我们可以使用结构体绑定,也可以使用二维数组来绑定。

方法1

最简单的想法是使用结构体来绑定。使用结构体,把名字和身高绑定起来,排序结构体数组,再回写名字即可。需要注意的是,为防止内存泄漏,结构体数组最后是需要释放的,如果直接让返回数组的元素存储结构体数组中元素对应名字的地址,就会出现野指针错误。所以正确的做法是,开辟一块新空间用来存储字符串,并使用strcpy函数把字符串从结构体数组中拷贝到返回数组中。

#define NAME_LENGTH_MAX 20typedef struct PeoInfo
{char* name;int height;
}PeoInfo;int CmpByHeight(const void* p1, const void* p2)
{return ((PeoInfo*)p2)->height - ((PeoInfo*)p1)->height;
}char ** sortPeople(char ** names, int namesSize, int* heights, int heightsSize, int* returnSize){// 创建结构体数组PeoInfo* info = (PeoInfo*)malloc(sizeof(PeoInfo) * namesSize);for (int i = 0; i < namesSize; ++i){info[i].name = names[i];info[i].height = heights[i];}// 排序结构体数组qsort(info, namesSize, sizeof(PeoInfo), CmpByHeight);// 回写身高信息char** ret = (char**)malloc(sizeof(char*) * namesSize);*returnSize = namesSize;for (int i = 0; i < namesSize; ++i){ret[i] = (char*)malloc(sizeof(char) * (NAME_LENGTH_MAX + 1));strcpy(ret[i], info[i].name);}free(info);info = NULL;return ret;
}

在这里插入图片描述

方法2

由于数组中的元素都是相同类型的,我们想要排序的身高数组的元素是int类型的,而下标也是int类型的,所以可以使用二维数组把身高和对应位置的下标绑定起来。具体的,可以创建一个size行2列的二维数组,第一列存储身高,第二列存储对应的下标,排序时对行进行排序,这样身高排序成功的同时,也记住了原始的下标,这样就能通过原始的下标找到一开始对应的名字了。这种解法较为巧妙,因为二维数组作为栈上的元素,在出作用域后会被销毁,但是不影响返回数组,这是由于返回数组里存储的是原名字数组中元素的地址,而在oj里,所有传递的形式参数都是在堆上开辟的,函数返回后并不会销毁,所以这么实现是可行的。

// 比较指针指向的第一个整数
int cmp(const void* p1, const void* p2)
{return *(int*)p2 - *(int*)p1;
}char ** sortPeople(char ** names, int namesSize, int* heights, int heightsSize, int* returnSize){// 把原下标和对应身高绑定int heighti[heightsSize][2];for (int i = 0; i < heightsSize; ++i){heighti[i][0] = heights[i];heighti[i][1] = i;}// 对二维数组的每一行排序qsort(heighti, heightsSize, sizeof(heighti[0]), cmp);// 根据排序后的二维数组,把对应下标的名字写回新数组char** ret = (char**)malloc(sizeof(char*) * namesSize);*returnSize = namesSize;for (int i = 0; i < namesSize; ++i){ret[i] = names[heighti[i][1]];}return ret;
}

在这里插入图片描述

总结

2种绑定的思路:一种思路是使用结构体直接把名字和身高绑定,另一种思路是使用二维数组把身高和对应下标绑定。回写时根据绑定的思路,选择是直接回写还是通过下标找到对应元素再回写。

感谢大家的阅读!

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

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

相关文章

2023校招,2024校招,社招Shein,大量HC,使用内推码直达,流程快速

广州&#xff0c;深圳&#xff0c;南京&#xff0c;大量开发岗位&#xff0c;包含Java开发岗&#xff0c;前端开发岗大数据开发岗位&#xff0c;产品岗位&#xff0c;测试岗位等等&#xff0c;大量hc&#xff0c;欢迎大家投递Shein&#xff0c;打造全球化的快时尚跨境电商品牌

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 4 日论文合集)

文章目录 一、分割|语义相关(18篇)1.1 TomatoDIFF: On-plant Tomato Segmentation with Denoising Diffusion Models1.2 CGAM: Click-Guided Attention Module for Interactive Pathology Image Segmentation via Backpropagating Refinement1.3 RefSAM: Efficiently Adapting …

Pico版节奏光剑简单制作

视频教程参考&#xff1a;Pico VR Neo3开发实战教程&#xff08;1&#xff09;——节奏光剑&#xff0c;舞台灯效_哔哩哔哩_bilibili 1、新建项目和pico配置 插件导入 找到下载的pico SDK 选择json文件&#xff0c;点击即可导入 启用插件 在 Project Settings 窗口中&#xf…

Spring AOP讲解及实例

Aop面向切面编程 文章目录 Aop面向切面编程什么是AOPAOP术语Spring AOP 的使用导入依赖编写切面类切面定义语法小细节输出日志成功 什么是AOP AOP&#xff1a;&#xff08;Aspect Oriented Programming&#xff09;面向切面编程&#xff0c;和OOP&#xff08;Object Oriented …

Vue3 网络请求——axios 高级用法之 axios 拦截器实战与并发请求

文章目录 &#x1f4cb;前言&#x1f3af;关于拦截器&#x1f3af;项目创建&#x1f3af;代码分析&#x1f3af;补充&#xff1a;并发请求&#x1f9e9;axios.all() 和 Promise.all() 的区别 &#x1f4dd;最后 &#x1f4cb;前言 Axios 是一个流行的基于 Promise 的 HTTP 客户…

设计模式3:单例模式:静态内部类模式是怎么保证单例且线程安全的?

上篇文章&#xff1a;设计模式3&#xff1a;单例模式&#xff1a;静态内部类单例模式简单测试了静态内部类单例模式&#xff0c;确实只生成了一个实例。我们继续深入理解。 静态变量什么时候被初始化&#xff1f; public class Manager {private static class ManagerHolder …

【SQL应知应会】行列转换(三)• Oracle版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 行列转换 • Oracle版 oracle的行列转换前言1.数据…

免费开源 | 基于SpringBoot的博客系统

介绍 基于springboot后端架构&#xff0c;websocket实现私信&#xff0c;前端采用thymeleafbootstraplayuiRedis 注册使用邮箱验证注册&#xff0c;且验证码存在redis中&#xff0c;所以需要有redis环境 软件架构 springbootwebsocketthymeleafbootstraplayuiRedismysql 8.…

vue项目业务实现,视频监控-文件流,大屏适配方案(v-scale-screen),websocket前端

最近把以前的业务场景及解决方案整理了一下&#xff0c;具体实现的工具如下&#xff1a; 监控-视频文件流>video.js videojs-contrib-hls 大屏适配方案> v-scale-screen websocket>sockjs-client webstomp-client 视频监控-文件流 使用方法 下载video插件&#xf…

Jmeter性能优化方案

最近用jmeter测试并发出现了访问端口异常问题的排查及解决方案做一个归纳&#xff1a; 背景&#xff1a;接口压测异常情况发生率达到了99% 线上情况&#xff1a; 错误情况展示&#xff1a; 原因&#xff1a; Jmeter里的http sample勾选了keep alive&#xff0c;导致会话一直…

系统上线前,SQL脚本的9大坑

前言 系统上线时&#xff0c;非常容易出问题。 即使之前在测试环境&#xff0c;已经执行过SQL脚本了。但是有时候&#xff0c;在系统上线时&#xff0c;在生产环境执行相同的SQL脚本&#xff0c;还是有可能出现一些问题。 有些小公司&#xff0c;SQL脚本是开发自己执行的&am…

第47步 深度学习图像识别:SqueezeNet建模(Pytorch)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;SqueezeNet SqueezeNet是一种轻量级的深度神经网络架构&#xff0c;由Iandola等人在2016年提出。这种模型的最大特点是参数量极少&#xff0c;仅有510千个参数&#xff0c;而且模型大小只有5MB&#xff0c;比…