プライオリティキューを使用して、自分で構築したデータ型を解決します

C++ には、最大ヒープと最小ヒープという 2 つの優先キューがあります。データ型が int の場合は誰もがそれを使用しますが、データが単一ではない場合、たとえばデータがハッシュマップの場合はどうなるでしょうか。例は次のとおりです。

string の配列 と、個別の正の整数 で構成される names配列が 与えられます 。どちらの配列も length です heightsn

各インデックスについて 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;
    }
};

 もちろん、これは問題を解決するための単なるテンプレートです。タイトルに「高さが異なる」と記載されているため、この方法はこの特徴を考慮しておらず、最適な解決策ではありません。他の貪欲アルゴリズムも、このような構造を構築して解決することができます。

おすすめ

転載: blog.csdn.net/weixin_41579872/article/details/130367523