最小的k个数

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>

using namespace std;

//全排序
//复杂度O(n*logn)
vector<int> Full_sorting(vector<int> input, int k) {
   vector<int> res;
   if(input.empty()||k>input.size()||k<=0) return res;

   sort(input.begin(),input.end());

   for(int i=0;i<k;i++)
       res.push_back(input[i]);

   return res;

}

//BFPRT算法,在时间复杂度O(N)内,从无序的数组中找到第k小的数
//再用快排,做一次选择排列,相当于改进版本的快速排序(初始元素不选第一个,而尽量选择中间的)
//适合非海量数据
//可以证明复杂度O(n)
//见[2]


//最大堆
//建堆复杂度O(k),重建一次堆O(logk),重复n-k次,总复杂度O(k+(n-k)*logk);
//数量级O(n*logk)
vector<int> Max_Heap(vector<int> input, int k) {
   int len=input.size();
   if(len<=0||k>len||k<=0) return vector<int>();

   vector<int> res(input.begin(),input.begin()+k);
   //for (int i = 0; i < k; i++) result.push_back(input[i]);
   make_heap(res.begin(),res.end());
   for(int i=k;i<len;i++){
       if(input[i]<res[0]){
           pop_heap(res.begin(),res.end());
           res.pop_back();
           res.push_back(input[i]);
           push_heap(res.begin(),res.end());
       }
   }
   sort_heap(res.begin(),res.end());
   return res;
}

//也是用堆,不过是对整个数据建一个最小堆(O(n)),然后取出堆顶元素,
//每取完一次更新一次堆(O(logn)),取K次,所以总的复杂度是O(n+K*logn);
//数量级上与最大堆不存在差别,但其空间复杂度更大(n>m)
//所以综合来讲,最大堆解决这种方法比最小堆有优势
//算法改进:每次取走堆顶元素更新堆时,正常是把堆中最后一个元素放到堆顶,
//然后调整堆将其下调到他应该在的位置。改进后,此元素不用下调到他原所应该在的位置,
//而是下调顶多K次就可以了。

//红黑树 原理上讲没看出和最大堆不同,写法上区别,可能因为对红黑树不了解
//复杂度O(nlogk)
vector<int> Red_and_black_Trees(vector<int> input, int k) {
   int len=input.size();
   if(len<=0||k>len||k<=0) return vector<int>();

   //multiset<int> sbt;         //默认小到大
   //multiset<int, greater<int> > sbt; //定义大到小
   //sbt.empty()      //判断是否有元素
   //sbt.insert(x)    //插入x元素
   //sbt.erase(x);    //删除x元素
   //sbt.size(x)      //x元素有多少个
   //sbt.begin()       //第一个元素*(sbt.begin())
   multiset<int, greater<int> > leastNums;
   vector<int>::iterator vec_it=input.begin();
   for(;vec_it!=input.end();vec_it++){
       if(leastNums.size()<k)
           leastNums.insert(*vec_it);
       else{
           multiset<int, greater<int> >::iterator greatest_it=leastNums.begin();
           if(*vec_it<*(leastNums.begin())){
               leastNums.erase(greatest_it);
               //leastNums.erase(*greatest_it);也可以
               //删除时均ok,插入时必须加*
               leastNums.insert(*vec_it);
           }
       }
   }
   return vector<int>(leastNums.begin(),leastNums.end());
}

int main()
{
    int a[] = {10,20,30,5,15};
    vector<int> v(a,a+5);
    vector<int> r;
    vector<int>::iterator it;
    int k=3;
    //r = Red_and_black_Trees(v,k);
    //r = Full_sorting(v,k);
    r = Max_Heap(v,k);

    for(it=r.begin();it!=r.end();it++){
     cout << *it << ' ';
    }
    cout << endl;
    return 0;
}

参考:

[1] https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf
[2]https://www.jianshu.com/p/5ad9ca0e3cf6

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序...
    stevewang阅读 6,889评论 1 4
  • 寻找最小的 k 个数 题目描述: 输入 n 个整数,输出其中最小的 k 个。 分析和解法: 解法一:排序输出 要求...
    MinoyJet阅读 572评论 0 0
  • 深夜里沿着我脚边 藤条伸向那些高傲的鞋面 于是我是一个小人 跪着爬着在光亮的表面 游动。穿梭。不停歇的认输 如果月...
    白蕙侨阅读 102评论 2 1
  • 管住嘴迈开腿而在减肥的第十九天没有时间迈开腿然而对于夜宵也没有管住嘴 这两天一直很烦躁 对于旁边的这位同事 不管是...
    无敌大美人st阅读 139评论 0 1
  • 老实说,自己成为父母那会儿,心理上是完全没过关的。 一结婚就有了小孩,吐得翻天覆地,医生说这种情况属于孕娠反应中毒...
    唐薇阅读 224评论 2 3