1. 程式人生 > 實用技巧 >c++ priority_queue應用(重要)

c++ priority_queue應用(重要)

自定義排序

重寫仿函式

 struct cmp{
     bool operator() ( Node a, Node b ){//預設是less函式
         //返回true時,a的優先順序低於b的優先順序(a排在b的後面)
         if( a.x== b.x ) return a.y> b.y;      
         return a.x> b.x; }
 };

struct cmp1{
  bool operator () ( int a , int b ){
    return a > b;
  }
};
struct cmp2{
  bool operator ()( int s ,int d ){
    return s<d;
  }
};
priority_queue<int> q;//預設是從大到小。大頂堆

priority_queue<int, vector<int> ,less<int> >q;//從大到小排序。大頂堆

priority_queue<int, vector<int>, greater<int> >q;//從小到大排序。小頂堆

priority_queue < int , vector<int> , cmp2 > q;//從大到小。大頂堆

priority_queue < int , vector<int> , cmp1 > q;//從小到大。大頂堆

關於priority_queue中元素的比較

  模板申明帶3個引數:priority_queue<Type, Container, Functional>,其中Type 為資料型別,Container為儲存資料的容器,Functional 為元素比較方式。

  Container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。STL裡面預設用的是vector。

如果把後面2個引數預設的話,優先佇列就是大頂堆(降序)

347.Top K Frequent Elements

Given a non-empty array of integers, return thekmost frequent elements.

Example 1:

Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]

Example 2:

Input: nums = [1], k = 1
Output: [1]

Note:

  • You may assumekis always valid, 1 ≤k≤ number of unique elements.
  • Your algorithm's time complexitymust bebetter than O(nlogn), wherenis the array's size.
  • It's guaranteed that the answer is unique, in other words the set of the top k frequent elements is unique.
  • You can return the answer in any order
class Solution {
public:
    struct cmp{
         bool operator()(pair<int,int>& a,pair<int,int>& b){
            if(a.second >= b.second) return true;
            else return false;
         }
    };
    
    vector<int> topKFrequent(vector<int>& nums, int k) {
        //sort(nums.begin(),nums.end());
        vector<int> res;
        map<int,int> freq2num;
        for(int i=0;i<nums.size();i++){
            freq2num[nums[i]]++;
        }
        //預設大頂堆,我們需要小頂堆
        priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> p;
        for(auto iter=freq2num.begin();iter!=freq2num.end();iter++){
            if(p.size()<k){
                p.push(*iter);
            }else{
                if(p.top().second<iter->second){
                    p.pop();
                    p.push(*iter);
                }
            }
        }
        while(p.size()){
          res.push_back(p.top().first); 
          p.pop();
        }
        return res;
    }
};

 vector<int> topKFrequent(vector<int>& nums, int k) {
        vector<int> res;
        map<int,int> m;
        for(auto c:nums)
        {
            m[c]++;
        }
     //預設大頂堆,我們選前k個。 priority_queue
<pair<int,int>> q; //map中iter->first是要返回的數字,ietr->second是數字的個數 for(auto iter=m.begin();iter!=m.end();iter++) { pair<int,int> pr=make_pair(iter->second,iter->first); q.push(pr); } while(k--) { res.push_back(q.top().second); q.pop(); } return res; }