在一个无序数组中找到第k大的数

这里是用了最小堆保存当前最大的k个数,堆顶即为top k中最小的数,每次和堆顶的数比较即可,实现直接用了stl的multiset(堆得具体实现这里不在赘述),调整堆得复杂度是logk,需要遍历整个数组,所以总的time cost是o(nlogk)

  • 一、使用multiset实现
#include <iostream>

int find_nth_largest(const vector<int> v, int k)
{
    int res = 0;
    multiset<int> s;
    for (int i = 0; i < k; ++i)
    {
        s.insert(v[i]);
    }

    for (int j = k; j < v.size(); ++j)
    {
        s.insert(v[j]);
        s.erase(s.begin());
    }
    
    return *s.begin();
}

int main() {
    vector<int> v4{1, 2, 3, 3, 6, 9};
    cout << find_nth_largest(v4, 2) << endl; 
    
    vector<int> v5{1, 2, 3, 3, 6, 9, 100, 88, 76};
    cout << find_nth_largest(v5, 3) << endl; 
}

执行结果

6
76
  • 二、使用make_heap实现
#include <iostream>
#include <algorithm>

int find_nth_largest2(vector<int>& v, int n)
{
    int res = 0;
    while(n-- >0) 
    {
        make_heap(v.begin(), v.end());
        pop_heap(v.begin(), v.end());
        res = v.back();
        v.pop_back();
    }
    return res;
}

int main() {
    vector<int> v4{1, 2, 3, 3, 6, 9};
    cout << find_nth_largest2(v4, 2) << endl; 
    
    vector<int> v5{1, 2, 3, 3, 6, 9, 100, 88, 76};
    cout << find_nth_largest2(v5, 3) << endl; 
}

执行结果

6
76
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 教你如何迅速秒杀掉:99%的海量数据处理面试题 本文经过大量细致的优化后,收录于我的新书《编程之法》第六章中,新书...
    Helen_Cat阅读 7,461评论 1 39
  • 题记: 直接插入排序(稳定)-->希尔排序 : 属于插入排序 简单选择排序(稳定)-->堆排序 :属于选择排序...
    Pitfalls阅读 2,832评论 2 3
  • 转自http://blog.csdn.net/v_july_v/article/details/7382693 题...
    士多啤梨苹果橙_cc15阅读 1,464评论 0 2
  • 今天我又来到了那家一直觉得味道很棒的港式餐厅,上次带着朋友过来,他们评价一般。我想验证下,是味道变了还是感觉变了,...
    路人盯阅读 261评论 0 0
  • 窗外下着雨,不知道从什么时候开始的。 清晨五点雨敲玻璃,叫醒沉睡的我。 睁开惺松的眼睛,伸手摸来手机看看时间,看看...
    小小野丫头阅读 172评论 0 0