C++ には、最大ヒープと最小ヒープという 2 つの優先キューがあります。データ型が int の場合は誰もがそれを使用しますが、データが単一ではない場合、たとえばデータがハッシュマップの場合はどうなるでしょうか。例は次のとおりです。
string の配列 と、個別の正の整数 で構成される names
配列が 与えられます 。どちらの配列も length です 。heights
n
各インデックスについて i
、 、 names[i]
、 は 人物heights[i]
の名前と身長を示します ith
。
人の身長の降順でnames
並べ替えて 返します 。
例 1:
入力: names = ["Mary","John","Emma"]、高さ = [180,165,170] 出力: ["Mary","Emma","John"] 説明:メアリーが最も背が高く、次にエマ、ジョンが続きます。 。
例 2:
入力: names = ["Alice","Bob","Bob"]、heights = [155,185,150] 出力: ["Bob","Alice","Bob"] 説明:最初のボブが最も背が高く、次にアリスが続きますそして2人目のボブ。
プライオリティキューを使うと非常に簡単ですが、2種類をどう含めるかが難しいので、ペアという魔法のようなものを考えてみました。次に最大ヒープの比較関数ですが、構造体を記述して比較関数を宣言する必要があります。したがって、コードは次のようになります。
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;
}
};
もちろん、これは問題を解決するための単なるテンプレートです。タイトルに「高さが異なる」と記載されているため、この方法はこの特徴を考慮しておらず、最適な解決策ではありません。他の貪欲アルゴリズムも、このような構造を構築して解決することができます。