美文网首页编程之美
BoP——2.5最大的k个数

BoP——2.5最大的k个数

作者: Myth52125 | 来源:发表于2017-10-15 19:24 被阅读0次

题目

在一堆数中,找到最大(小)的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之间的数。也就是分段求。不再该范围的数直接舍弃,那么就需要多次遍历数组。

方法四

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

相关文章

  • BoP——2.5最大的k个数

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

  • [Code] 算法心得—数组篇

    2.1 寻找最大的k个数 输入包含n个整数的数组,输出其中最大的k个数。要求:输出的数字不能重复,如果k大于可输出...

  • 寻找最大的K个数

    解法1、 常规方法 ,如果数组很大呢?是放在堆还是放在栈呢?? 这个是一个问题;时间复杂度是O(N *logN) ...

  • 寻找最大的K个数

    解法1:可以使用容量为K的最小堆来存储最大的K个数,最小堆的堆顶元素就是最大K个数中最小的一个。每次新考虑一个数X...

  • 求N个无序数组中第K(大/小)数的方法

    思路一:时间复杂度为O(N*logk) 对前k个数,建立最大堆,对于后面N-k个数,依次和最大堆的最大数比较,如果...

  • 算法-数组(三)

    最小的k个数 求子数组的最大和 把数组排成最小的数字 1.最小的k个数 问题描述:输入n个数字,找到数组中最小的k...

  • 【转载】N个数里面找出最大的k个数

    https://www.douban.com/note/275544555/ 题目:给出N个无序的数,然后找出其中...

  • Top K问题,求最大的第K个数

    leetcode 215 此题大概几种思路, 伪代码实现: 将n个数排序后,取最大的第k个数 时间复杂度 O(nl...

  • codeforce-Balanced Teams(DP)

    Balanced Teams题意给你n个数,将这n个数最多分成k组,但是每组中的数最大差值不超过5,k组中的人数最...

  • 优先队列找出最小的k个数

    优先队列内部维持了一个堆,堆的特点是堆顶元素最大(或最小),利用优先队列查找最小的k个数的方法:1、把前k个数当成...

网友评论

    本文标题:BoP——2.5最大的k个数

    本文链接:https://www.haomeiwen.com/subject/rppfuxtx.html