按身高排序

题目描述

给你一个字符串数组 namesnamesnames,和一个由互不相同的正整数组成的数组 heightsheightsheights。两个数组的长度均为 nnn。

对于每个下标 iii,namesinamesinamesi 和 heightsiheightsiheightsi 表示第 i 个人的名字和身高。

请按身高 降序 顺序返回对应的名字数组 namesnamesnames。

示例 1 :

输入 :names = "Mary","John","Emma", heights = 180,165,170

输出 :"Mary","Emma","John"

解释:Mary 最高,接着是 Emma 和 John 。

示例 2 :

输入 :names = "Alice","Bob","Bob", heights = 155,185,150

输出 :"Bob","Alice","Bob"

解释:第一个 Bob 最高,然后是 Alice 和第二个 Bob。

解法 1

在这里不能直接对身高数组排序,因为对身高数组排序后,通过身高就找不到对应的名字了。所以我们先创建一个存放二元组的数组,二元组是 <身高,名字>,然后遍历身高数组,将身高和对应的名字存到数组中,最后按照身高对这个数组排序,遍历这个数组,按顺序取出所有的名字即可。这种做法在数组中存储了身高和名字两种信息,比较耗费空间

cpp 复制代码
class Solution {
    using PIS = pair<int, string>;
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) 
    {
        vector<PIS> person;
        for (int i = 0;i < heights.size();++i)
        {
            person.push_back({heights[i], names[i]});
        }

        sort(person.begin(), person.end(), [](const PIS& p1, const PIS& p2){
            return p1.first > p2.first;
        });

        vector<string> ret;
        for (auto& [height, name] : person)
        {
            ret.push_back(name);
        }
        return ret;
    }
};

解法 2

创建一个哈希表,保存身高和名字的映射关系。先遍历身高数组,将身高和名字的映射关系记录到哈希表里,然后对身高数组排序,再遍历身高数组,从哈希表里提取出对应的名字即可。这种方法的缺陷是,哈希表不能存重复的值,如果存在两个人,他们都的身高相同,就找不到另外一个人的身高了,此时哈希表的 valvalval 要保存一个字符串数组,比较耗空间

cpp 复制代码
class Solution
{
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) 
    {
        unordered_map<int, string> hash;
        for (int i = 0;i < heights.size();++i)
        {
            hash[heights[i]] = names[i];
        }

        sort(heights.begin(), heights.end(), greater<int>());

        vector<string> ret;
        for (int height : heights)
        {
            ret.push_back(hash[height]);
        }
        return ret;
    }
};

解法 3

对数组排序,但是又不希望影响原来的映射关系的场景,我们可以选择创建一个下标数组解决,具体的步骤是:

  1. 创建一个下标数组
  2. 按照题目要求,对下标数组排序
  3. 通过排完序的下标数组,提取出原数组的信息

以示例 111 为例,下标数组刚开始保存了所有人的下标:

cpp 复制代码
class Solution
{
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) 
    {
        vector<int> indices(heights.size());
        for (int i = 0;i < heights.size();++i)
        {
            indices[i] = i;
        }

        sort(indices.begin(), indices.end(), [&](int i, int j){
            return heights[i] > heights[j];
        });

        vector<string> ret;
        for (int i : indices)
        {
            ret.push_back(names[i]);
        }
        return ret;
    }
};
相关推荐
会编程的小孩5 小时前
C++ qt的安装
c++
企业数字化笔记7 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!8 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小成2023032026510 小时前
C++~07补充
开发语言·c++
小郎君65810 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧10 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
hold?fish:palm10 小时前
40 二叉树的直径
c++·leetcode
Shimeri11 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
解决小子11 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
Evand J11 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波