题目描述
给你一个字符串数组 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
对数组排序,但是又不希望影响原来的映射关系的场景,我们可以选择创建一个下标数组解决,具体的步骤是:
- 创建一个下标数组
- 按照题目要求,对下标数组排序
- 通过排完序的下标数组,提取出原数组的信息
以示例 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;
}
};