LeetCode - 347. Top K Frequent Elements - C++

哈希表+堆

借鉴了这个博客

大根堆O(nlogn)

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> hash;
        priority_queue<pair<int, int>> heap;
        vector<int> result;
        
        for(int num:nums) {
            hash[num]++;
        }
        
        for(auto item:hash) {
            heap.push(make_pair(item.second, item.first));
        }
        
        for(int i=0; i<k; i++) {
            result.push_back(heap.top().second);
            heap.pop();      
        }
        return result;
    }
};

小根堆O(nlogk)

class Solution {
    
    typedef pair<int, int> dataType;
        
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> hash;
        priority_queue<dataType, vector<dataType>, greater<dataType> > heap;
        vector<int> result;
        
        for(int num:nums) {
            hash[num]++;
        }
        
        for(auto item:hash) {
            heap.push(make_pair(item.second, item.first));
            if(heap.size() > k) heap.pop();
        }
        
        while(!heap.empty()) {
            result.push_back(heap.top().second);
            heap.pop();
        }
        
        return result;
    }
};

逻辑不难,就是用到了很多东西:

1.unordered_map

2.priority_queue:默认大根堆;第二个参数是容器,第三个是比较函数  https://www.cnblogs.com/Deribs4/p/5657746.html

.size() .empty()  .push()  .top()  .pop()  类似于栈

3.pair<int, int>  make_pair(a, b)

4.deftype

5.auto

6.for的:操作符

猜你喜欢

转载自blog.csdn.net/L_bic/article/details/88931395