TOP K 问题的多种实现方法

// Date   : 2016.10.25
// Author : yqtao
// https://github.com/yqtaowhu
#include <iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<functional>
#include<queue>
using namespace std;
int partition(vector<int>& data, int left, int right) {
    int i = left, j = right, pivot = data[left];
    while (i < j) {
        while (i < j&&data[j] >= pivot) j--;
        data[i] = data[j];
        while (i < j&&data[i] <= pivot) i++;
        data[j] = data[i];
    }
    data[i] = pivot;
    return i;
}
vector<int> getLeastNums(vector<int>& data, int k) {
    int n = data.size();
    if (n <= 0 || k <= 0 || k > n) return vector<int>();
    int left = 0, right = n - 1;
    int index = partition(data, left,right);
    while (index != k - 1) {
        if (index > k - 1) {
            right = index - 1;
            index = partition(data, left, right);
        }
        else {
            left = index + 1;
            index = partition(data, left, right);
        }
    }
    vector<int>res(data.begin(), data.begin() + k);
    return res;
}
//solution 2
//特别注意的一点multiset,和set的不同
//mulgiset可以具有重复值,而set不是,二者都是基于红黑书实现的
vector<int> getLeastNums2(vector<int>& data, int k) {
    int n = data.size();
    if (n <= 0 || k <= 0 || k > n) return vector<int>();
    multiset<int,greater<int>> st;
    auto it = data.begin();
    for (; it != data.end(); ++it) {
        if (st.size() < k) st.insert(*it);
        else {
            auto iter = st.begin();
            if (*it < *iter) {
                st.erase(iter);
                st.insert(*it);
            }
        }
    }
    vector<int>res(st.begin(), st.end());
    return res; 
}
//优先队列,本质是根实现的
vector<int> getLeastNums3(vector<int>& data, int k) {
    int n = data.size();
    if (n <= 0 || k <= 0 || k > n) return vector<int>();
    priority_queue<int,vector<int>,greater<int>> que;  //greater表示的是小根堆,一定要注意了
    for (int i = 0; i < n; i++)
        que.push(data[i]);
    vector<int> res;
    while (res.size() < k) {
        res.push_back(que.top());
        que.pop();
    }
    return res;
}
int main() {
    vector<int> data = { 1,3,5,7,23,22,5,78,7,0 };
    vector<int> res = getLeastNums3(data,5);
    for (auto c : res)
        cout << c << " ";
    cout << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值