阿里一面直挂题

给定一个巨大的无序数组,输出数组中出现次数最多的K个数。

思路很简单,TopN问题,真的是足够简单了,然而我还是写了半天,还特么没写对


class Solution{

//默认是最大堆,重载一下操作符(反过来的),就能实现最小堆
struct cmp{
    bool operator()(const pair& a, const pair& b){
        return a.second > b.second;
}
};

public:
vector findtopN(vector& num, int N){
    unordered_map hmap;
    for(int value : num)
        hmap[value]++;
    priority_queue, vector>, cmp> heap;
    auto iter = hmap.begin();
    for(int i = 0; i < N ; i++, iter++){
        heap.push(*iter);
    }
    for( ; iter!=hmap.end(); iter++){
        if(iter->second > heap.top().second){
                heap.pop();
                heap.push(*iter);
          }
      }
    vector result;
    while(!heap.empty()){
        result.push_back(heap.top().first);
        heap.pop();
      }
    sort(result.begin(), result.end());
    return result;
}
};

···

你可能感兴趣的:(阿里一面直挂题)