BoP——2.5最大的k个数

题目

在一堆数中,找到最大(小)的K个,或者时第k个。如果我们找到了后k个数,那么最大的k个也就找到了。
所以下面的方法都在找第k大的数

方法一

当然时最本的方法,先排序,然后在取数。

方法二

快排的思想,递归进行,将k转化为下标,向下标k靠拢

//代码没跑,思想就是这样。
#include <vector>

using namespace std;

size_t findBigK_partition(vector<int> &source,size_t start,size_t end)
{

    size_t low=start;
    for(size_t i=start;i<end;i++)
    {
        if(source[i]<source[end])
        {
            swap(source[i],source[low]);
            low++;
        }
    }
    swap(source[low],source[end]);
    return low;
}
//
void findBigK_quicksort(vector<int> &source ,size_t start,size_t end,const size_t &k)
{
    if(start >= end)
    {
        return;
    }
    size_t mid = findBigK_partition(source,start,end);
    
    if(mid > k)
    {
        findBigK_quicksort(source,start,mid,k);
    }else if(mid == k){
        return ;
    }else if(mid >k){
        findBigK_quicksort(source,mid,end,k);
    }
}

int findBigK_quick(vector<int> source,size_t k)
{
    k=source.size()-k;
    findBigK_quicksort(source,0,source.size(),k);
    return source[k];
}

方法三

内存有要求的情况下

使用最小二叉堆。始终保存最大的k个数,小于的直接抛弃,如果当前数比现在大,那么替换堆顶元素,然后下沉。只需要遍历一次。
如果k个数,仍然不满足内存的要求,那么先求最大的m(m>k)个数,然后在求m~k之间的数。也就是分段求。不再该范围的数直接舍弃,那么就需要多次遍历数组。

方法四

如果数据量不大,或者范围固定,那么直接使用桶排序,然后最后在统计。

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

推荐阅读更多精彩内容

  • 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去...
    左上偏右阅读 11,799评论 0 11
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,348评论 0 33
  • 教你如何迅速秒杀掉:99%的海量数据处理面试题 本文经过大量细致的优化后,收录于我的新书《编程之法》第六章中,新书...
    Helen_Cat阅读 12,114评论 1 39
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,118评论 0 11
  • 1. 别看琼瑶的书,那些唯美的爱情都是乌托邦,现实一点,惜取眼前人。­ 2. 别以为,男人都欢娇弱爱哭的女人,只有...
    小义子_正版阅读 3,283评论 0 1