按身高排序

题目描述

给你一个字符串数组 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;
    }
};
相关推荐
I_belong_to_jesus9 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla10 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu16 小时前
一个通用游戏数据服务器
c++·架构
another heaven16 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude16 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司16 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP19 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck19 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀19 小时前
背包DP(01背包+完全背包)
c++·算法