LeetCode 2418:按身高排序 —— 题解
欢迎阅读 欢迎来到「按身高排序」题解之旅本文将带你从“按身高降序输出名字”这一排序需求出发深入理解多种排序实现方式并掌握创建二元组、哈希表映射、对下标排序三种经典技巧的适用场景。在开始之前建议你先了解题目背景这是 LeetCode 2418 题给定两个等长数组names和heights身高值互不相同要求按身高降序返回对应的名字数组。这是一道排序与映射的入门题但提供了多种解法思路可灵活应用到其他类似场景。明确学习目标掌握三种实现方式——①创建二元组将(身高, 名字)组合后排序直接提取名字②哈希表映射用哈希表存储身高 - 名字对身高数组排序后查表③对下标排序常用技巧对下标数组[0, n-1]按heights降序排序再按排好的下标取names。理解每种方法的优劣和适用性尤其是下标排序在避免额外空间或保持原数据不变时的通用价值。本文将从问题转化、三种解法详解二元组/哈希/下标排序、代码实现到复杂度分析层层递进。即使你对排序和映射还不熟悉我们也会从“把身高和名字绑在一起”的直觉出发让你轻松抓住核心思想——排序的本质是比较但比较的对象可以是组合、映射关系或索引。现在让我们一起按身高排好队叫出对应名字吧 一、题目2418. 按身高排序 - 力扣LeetCode​二、做题思路1. 问题分析前置分析给定两个长度相等的数组names名字和heights身高互不相同要求按身高降序返回对应的名字数组。核心挑战是在排序时保持名字与身高的对应关系。有三种常用解法创建二元组、哈希表映射、对下标排序。2. 解法一创建二元组2.1 核心思路将每个人封装为一个二元组(身高, 名字)存入新数组。对二元组数组按身高降序排序。依次提取排序后的名字组成结果数组。2.2 正确性说明简单版本二元组将每个名字与其身高绑定在一起排序时整体移动不会出现错位。只要按身高降序排序提取出的名字顺序即为题目所求。2.3 实现细节边界防护使用vectorpairint, string people存储二元组。自定义排序按first身高降序若身高相同则按原顺序但题目保证身高互不相同。遍历排序后的二元组取出second加入结果数组。2.4 代码class Solution { public: vectorstring sortPeople(vectorstring names, vectorint heights) { int n names.size(); // 1. 创建二元组数组 vectorpairint, string people; for (int i 0; i n; i) { people.push_back({heights[i], names[i]}); } // 2. 按身高降序排序 sort(people.begin(), people.end(), [](const pairlt;int, stringgt;amp; a, const pairlt;int, stringgt;amp; b) { return a.first gt; b.first; // 降序 }); // 3. 提取名字 vectorlt;stringgt; ans; for (autoamp; p : people) { ans.push_back(p.second); } return ans; } };2.5 流程图3. 解法二哈希表映射3.1 核心思路建立哈希表unordered_mapint, string将heights[i]映射到names[i]。将heights数组降序排序。遍历排序后的heights用每个身高值去哈希表中查找对应的名字依次加入结果。3.2 正确性说明简单版本因为身高值互不相同哈希表的键唯一所以每个身高能精确映射到唯一名字。按身高降序查找得到的名字顺序即为目标顺序。3.3 实现细节边界防护使用unordered_mapint, string hash存储映射。对heights数组进行降序排序可用sort 自定义比较或greaterint()。遍历排序后的heights通过hash[height]获取对应名字。注意哈希表查找是 O(1)整体时间复杂度 O(n log n)主要来自排序。3.4 代码class Solution { public: vectorstring sortPeople(vectorstring names, vectorint heights) { int n names.size(); // 1. 建立哈希映射 unordered_mapint, string hash; for (int i 0; i n; i) { hash[heights[i]] names[i]; } // 2. 复制身高数组并降序排序 vectorlt;intgt; sortedHeights heights; sort(sortedHeights.begin(), sortedHeights.end(), greaterlt;intgt;()); // 3. 根据排序后的身高查找名字 vectorlt;stringgt; ans; for (int h : sortedHeights) { ans.push_back(hash[h]); } return ans; } };3.5 流程图4. 解法三对下标排序非常常用的技巧4.1 核心思路创建一个下标数组index初始为[0, 1, 2, ..., n-1]。不移动names和heights而是对index进行排序排序依据是heights[index[i]]降序。排序后index中的顺序即为按身高降序排列的人员索引顺序。根据index顺序从names中取出对应名字组成结果数组。4.2 正确性说明简单版本通过下标作为“中介”将排序逻辑从数据本身剥离。index排序后记录了所有下标按身高降序的排列再通过下标访问原数组既能得到正确顺序又避免了原数据的移动是一种高效且常用的技巧。4.3 实现细节边界防护初始化index[i] i。使用sort(index.begin(), index.end(), [](int a, int b){ return heights[a] heights[b]; })。排序后遍历index用names[index[i]]构造结果。此方法不需要额外存储二元组或哈希表空间复杂度 O(n)。4.4 代码class Solution { public: vectorstring sortPeople(vectorstring names, vectorint heights) { int n heights.size(); // 1. 创建索引数组初始按 0..n-1 排列用于间接排序 vectorlt;intgt; index(n); for (int i 0; i lt; n; i) { index[i] i; } // 2. 根据身高数组对索引进行降序排序 // 自定义比较函数索引 i 对应的人的身高如果大于索引 j 的则 i 排在前面 sort(index.begin(), index.end(), [amp;](int i, int j) { return heights[i] gt; heights[j]; // 降序从高到矮 }); // 3. 按照排序后的索引顺序将对应的名字依次加入结果数组 vectorlt;stringgt; ret; for (auto idx : index) { ret.push_back(names[idx]); } // 4. 返回按身高降序排列的名字列表 return ret; } };4.5 流程图5. 三种解法对比总结解法核心操作空间复杂度是否修改原数组二元组创建新对象排序O(n)否哈希表键值映射 排序O(n)是对 heights 排序下标排序排序索引数组O(n)否不移动原数组 闭幕 恭喜你完成了「按身高排序」问题的学习为了巩固知识并进一步拓展建议你动手实践在 LeetCode 上提交代码尝试不同的测试用例。深入思考题目给出了三种解法创建二元组、使用哈希表、对下标排序。这三种方法的核心思想分别是什么各自适用于什么场景解法三“对下标排序”是非常常用的技巧它为什么能避免移动原始数据如果要求最终输出名字数组而不是下标这种方法的优势体现在哪里如果不仅要返回名字还要同时返回排序后的身高上述哪种方法最容易扩展延伸挑战将题目改为按名字的字典序排序但需要同时输出对应的身高你会选择哪种解法如果名字有重复哪种方法更稳妥如果你觉得本文对你有所帮助欢迎 点赞 / 收藏 关注作者获取更多题解 留言交流你的疑问或优化思路祝你在算法之路上越走越稳早日攻克每一道难题下次见 ✨

相关新闻

智能体技术提升个人效率的实践与优化

智能体技术提升个人效率的实践与优化

1. 智能体技术如何重塑个人效率上周我在整理年度工作复盘时,发现一个惊人事实:过去三个月里,我平均每天要花费2.7小时处理邮件归档、会议纪要整理、数据报表生成这类重复性工作。这促使我开始系统研究智能体技术(Agent Technology…

2026/7/27 7:35:22阅读更多 →
羽毛球剪辑算法集锦

羽毛球剪辑算法集锦

目录 good-badminton 推荐,看起来还行 racquet-sports-analyzer huji 推理脚本: 羽球时刻 推荐: Badminton-Highlight-Extraction good-badminton 推荐,看起来还行 https://github.com/qwpyyx/Good-Badminton racquet-spor…

2026/7/27 7:35:22阅读更多 →
C++高性能序列化与数据传输:大数据架构师的底层优化指南

C++高性能序列化与数据传输:大数据架构师的底层优化指南

1. 项目概述:从C基础到大数据架构的必经之路在技术这条路上,我见过太多开发者,尤其是那些从后端或大数据领域切入的朋友,对C的态度总是有些微妙。一方面,它被誉为“性能之王”,是构建底层基础设施、处理海量…

2026/7/27 7:35:22阅读更多 →
thinkphp8中事件的使用

thinkphp8中事件的使用

thinkphp8中事件的使用**事件使用主要有事件监听、事件订阅、事件绑定三种方式**生成相关类的命令行什么是自动注册什么是手动注册事件监听监听类,listener目录下的文件手动注册自动注册事件订阅订阅类,subscribe目录下手动注册自动注册事件绑定事件类&a…

2026/7/27 9:09:29阅读更多 →
C++日期模拟算法:从原理到实战,掌握闰年判断与日期计算

C++日期模拟算法:从原理到实战,掌握闰年判断与日期计算

1. 项目概述:为什么我们需要“日期模拟算法”? 在C编程,尤其是算法竞赛和日常业务开发中,处理日期和时间是一个高频且容易出错的环节。你可能遇到过这样的需求:计算两个日期之间相差的天数、判断某天是星期几、推算某个…

2026/7/27 9:09:29阅读更多 →
信奥赛入门:从计算圆看顺序结构程序设计的核心要点与避坑指南

信奥赛入门:从计算圆看顺序结构程序设计的核心要点与避坑指南

很多刚接触信奥赛(信息学奥林匹克竞赛)的同学,在拿到第一道编程题时,常常会陷入一个误区:题目看起来很简单,比如“计算圆的面积”,不就是套用公式 π * r * r 吗?但为什么提交后总…

2026/7/27 9:09:29阅读更多 →
DM642硬件设计实战:从官方文档到稳定板卡的避坑指南

DM642硬件设计实战:从官方文档到稳定板卡的避坑指南

1. 项目概述:一份来自一线的DM642硬件设计实战地图如果你正准备或正在设计一块基于TI TMS320DM642 DSP的板卡,并且感觉官方文档浩如烟海、无从下手,那么你来对地方了。这份所谓的“资源指南”更像是一个官方索引,它告诉你“有什么…

2026/7/27 9:09:29阅读更多 →
3分钟安装《十字军之王II》中文补丁:终极双字节字符支持指南

3分钟安装《十字军之王II》中文补丁:终极双字节字符支持指南

3分钟安装《十字军之王II》中文补丁:终极双字节字符支持指南 【免费下载链接】CK2dll Crusader Kings II double byte patch /production : 3.3.4 /dev : 3.3.4 项目地址: https://gitcode.com/gh_mirrors/ck/CK2dll 还在为《十字军之王II》游戏中文字符显示…

2026/7/27 9:09:29阅读更多 →
纯C++ LLM推理库llama.cpp:x86架构优化与Qwen模型部署实战

纯C++ LLM推理库llama.cpp:x86架构优化与Qwen模型部署实战

1. 项目概述:为什么我们需要一个纯粹的C LLM推理库?在AI模型部署的世界里,我们常常被各种复杂的依赖和庞大的框架所困扰。想象一下,你拿到一个很棒的模型,比如Qwen,想在自己的电脑上快速跑起来试试效果&…

2026/7/27 9:07:29阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →