【C++】TopK问题!

  • 问题描述:在无序的数组中查找最大(最小)的前K个元素?

例如:arr[] = {9,1,6,2,3,8,3,4,7,0}最大的四个元素是6,7,8,9

思路:使用小堆,先将数组中的K个元素插入到堆中,然后再从第K个开始遍历数组,如果数组中的元素大于,堆顶元素,就将对顶元素pop,然后再将数组中的元素push进堆里面去

实现代码:

#include
using namespace std;
#include
class compare{
    public:
    bool operator()(int a,int b){
        return a > b;
    }
};

int* FindTopK(int* arr,int n,int* ret,int m){
    compare com;
    priority_queue<int,vector<int>,greater<int> > q(arr,arr+m);
    int i = m;
    for(;iif(arr[i] > q.top()){
            q.pop();
            q.push(arr[i]);
        }
    }
    int j = 0;
    while(!q.empty()){
        ret[j++] = q.top();
        q.pop();
    }
}

int main(){
    int arr[] = {9,4,5,2,5,1,7,3,1,8};
    int ret[5];
    FindTopK(arr,10,ret,5);
    for(int i = 0;i<5;i++)
        cout<" ";
    return 0;
}

你可能感兴趣的:(C\C++)