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 上提交代码尝试不同的测试用例。深入思考题目给出了三种解法创建二元组、使用哈希表、对下标排序。这三种方法的核心思想分别是什么各自适用于什么场景解法三“对下标排序”是非常常用的技巧它为什么能避免移动原始数据如果要求最终输出名字数组而不是下标这种方法的优势体现在哪里如果不仅要返回名字还要同时返回排序后的身高上述哪种方法最容易扩展延伸挑战将题目改为按名字的字典序排序但需要同时输出对应的身高你会选择哪种解法如果名字有重复哪种方法更稳妥如果你觉得本文对你有所帮助欢迎 点赞 / 收藏 关注作者获取更多题解 留言交流你的疑问或优化思路祝你在算法之路上越走越稳早日攻克每一道难题下次见 ✨

相关新闻

强化学习与RLHF技术:从基础到优化算法解析

强化学习与RLHF技术:从基础到优化算法解析

1. 强化学习基础概念解析1.1 从动物训练看强化学习本质强化学习的核心机制可以用一个简单的动物训练场景来理解。想象你在训练一只小狗学习"坐下"这个指令:初始状态:小狗站立着,等待指令(S₀)动作尝试&#…

2026/10/16 22:47:56 阅读更多 →
Python循环结构解析:从基础语法到高级应用

Python循环结构解析:从基础语法到高级应用

1. Python循环结构:从零基础到实战进阶 刚接触Python时,循环结构往往是第一个让人既兴奋又困惑的概念。记得我最初写while循环时,因为漏了终止条件导致程序无限运行,只能强行关闭终端。这种"血的教训"恰恰说明了理解循环…

2026/10/16 5:21:50 阅读更多 →
低灰度差图像增强全解|详解DoG高斯差分频域带通算法、区分全局自适应阈值、强化低对比度特征、助力薄膜金属印刷微小缺陷检测、附完整OpenCV工程

低灰度差图像增强全解|详解DoG高斯差分频域带通算法、区分全局自适应阈值、强化低对比度特征、助力薄膜金属印刷微小缺陷检测、附完整OpenCV工程

目录 一、前言 二、工业低灰度差图像核心成因与算法失效分析 2.1 低对比度图像四大工业成型原因 2.2 传统图像处理算法核心失效根源 三、DoG高斯差分频域带通算法底层原理深度拆解 3.1 图像频率分量分层逻辑 3.2 空域DoG算法数学原理 3.3 频域优化增强逻辑 四、全局阈…

2026/10/14 21:49:10 阅读更多 →

最新新闻

MATLAB实现Elman神经网络电力负荷预测:时序建模与工程实践

MATLAB实现Elman神经网络电力负荷预测:时序建模与工程实践

1. 项目概述与核心需求解析电力负荷预测这个题目,在电力系统里是老生常谈,但真正把它做好的人不多。我接触过不少相关项目,也见过很多人拿历史负荷数据直接塞进神经网络里就跑,结果训练集误差看着挺漂亮,一到验证集就原…

2026/10/17 12:54:09 阅读更多 →
帧同步原理与实现:从输入同步到确定性保障

帧同步原理与实现:从输入同步到确定性保障

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 12:54:09 阅读更多 →
算法OJ作业Lecture(4):四重能力压力测试与破题心法

算法OJ作业Lecture(4):四重能力压力测试与破题心法

1. 这不是一节普通课,而是一次算法能力的“压力测试”“程序设计与算法 | (8) Lecture(4) OJ作业”——看到这个标题,很多刚接触算法训练的同学第一反应是:又到在线判题系统(OJ)交作业的时间了。但如果你真这么想&…

2026/10/17 12:54:09 阅读更多 →
North-Micro-Vision-Instruct-bf16 图像输入完全攻略:从本地图片到 URL 的多模态实战

North-Micro-Vision-Instruct-bf16 图像输入完全攻略:从本地图片到 URL 的多模态实战

【免费下载链接】North-Micro-Vision-Instruct-bf16 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/North-Micro-Vision-Instruct-bf16 点击查看 免费下载 North-Micro-Vision-Instruct-bf16 是一款面向 Apple Silicon 的多模态视觉语言模型&#xf…

2026/10/17 12:54:09 阅读更多 →
为什么你的小模型推理变慢了?SmolLM-Instruct_rai_1.8.0_medusa_1.0_npu 性能调优 10 个技巧

为什么你的小模型推理变慢了?SmolLM-Instruct_rai_1.8.0_medusa_1.0_npu 性能调优 10 个技巧

大模型基础模型 【免费下载链接】SmolLM-Instruct_rai_1.8.0_medusa_1.0_npu 项目地址: https://ai.gitcode.com/hf_mirrors/amd/SmolLM-Instruct_rai_1.8.0_medusa_1.0_npu 点击查看 免费下载 小模型推理明明应该飞快,为什么跑起来却越来越慢&#xff…

2026/10/17 12:54:09 阅读更多 →
Docker Harbor 安装配置全解析:从部署到运维的镜像治理实践

Docker Harbor 安装配置全解析:从部署到运维的镜像治理实践

做容器化落地的人迟早会碰到一个问题:镜像越来越多,靠 Docker 自带的 Registry 管不住权限,也管不住审计和复制。Docker Harbor安装配置就成了绕不开的一环——把 Harbor 部署起来,给团队一个靠谱的镜像中心。尤其是当团队规模超过…

2026/10/17 12:53:09 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →