在C++中优先队列有两种,最大堆和最小堆。当数据类型为int的时候,大家都会使用,但是如果数据不是单一的,比如数据是一个hashmap怎么办?例子如下:
You are given an array of strings names
, and an array heights
that consists of distinct positive integers. Both arrays are of length n
.
For each index i
, names[i]
and heights[i]
denote the name and height of the ith
person.
Return names
sorted in descending order by the people's heights.
Example 1:
Input: names = ["Mary","John","Emma"], heights = [180,165,170] Output: ["Mary","Emma","John"] Explanation: Mary is the tallest, followed by Emma and John.
Example 2:
Input: names = ["Alice","Bob","Bob"], heights = [155,185,150] Output: ["Bob","Alice","Bob"] Explanation: The first Bob is the tallest, followed by Alice and the second Bob.
使用优先队列,将会十分简单,难点在于怎么包含两种类型,于是想到了pair这个神奇的东西。然后就是最大堆的比较函数,需要写一个结构体,声明比较函数。于是代码如下:
class Solution {
typedef pair<string,int> PSI;
struct cmp
{
bool operator()(PSI a, PSI b)
{
return a.second<b.second;
}
};
public:
vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
priority_queue<PSI,vector<PSI>,cmp> pq;
vector<string> ans;
for(int i=0;i<heights.size();i++)
{
pq.push({names[i],heights[i]});
}
while(!pq.empty())
{
ans.push_back(pq.top().first);
pq.pop();
}
return ans;
}
};
当然,这只是一个解题的模板,因为题目中说身高互不相同,这种方法并没有考虑这个特性,并不是最优解。其他贪心的算法,也可以构建这样的结构来求解。