按身高排序

题目描述

给你一个字符串数组 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;
    }
};
相关推荐
程序员清风1 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
无定义_1 小时前
Codeforces Round 1124 (Div. 2)
算法
(Charon)2 小时前
【C++面试】vector底层原理:扩容、拷贝移动与迭代器失效
c++·面试
朔北之忘 Clancy2 小时前
青少年软编等考七级题解目录
开发语言·c++·青少年编程·gesp·csp·信奥赛·noi
汉克老师2 小时前
GESP2026年9月认证C++七级( 第一部分选择题(8~15题)精讲
c++·gesp·小学生·学c++编程
Mr_Macallon2 小时前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
垆边人似月.3 小时前
任务混部(200 分档)
算法
言乐63 小时前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先
如意猴3 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法