最小的k个数

来源:互联网 发布:mysql navicat 破解机 编辑:程序博客网 时间:2024/05/22 13:16

题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

两种解法
1、O(n)复杂度的算法,找到数组中第k大的数,按照快排的二分搜索的想法,首先设定一个数,把比这个数小的都放到这个数的左边,比这个数大的都放在这个数的右边。如果左边数的个数小于k,从右边继续寻找,否则从左半部分开始寻找。知道找到数字的下标为k。

2、O(nlogk)复杂度算法,适合处理海量数据,创建大小为k的容器,在k中找到最大数,可以构建一个最大堆在O(1)时间得到已有数组的最大值,O(logk)时间完成删除和插入操作。如果插入的元素比这个容器的最大值小,那么替换最大值。一直到最后,如果构建最大堆比较困难,可以使用STL现成的红黑树关联容器,如multiset。

下面的代码是解法1的代码:

class Solution {public:    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {        if(k>input.size()||input.size()<=0)            return vector<int>{};        vector<int> res;        int begin=0;        int end=input.size()-1;        while(begin<=end)            {            int temp=input[begin];            int i=begin;            int j=end;            while(i<j)                {                while(input[j]>=temp&&i<j)                    --j;                if(i<j)                input[i]=input[j];                while(input[i]<=temp&&i<j)                    ++i;                if(i<j)                input[j]=input[i];                            }            input[i]=temp;            if(i==k-1)                {                int count=0;                while(count<k)                    {                    res.push_back(input[count]);                    ++count;                }                return res;            }            else if(i<k-1)                {                begin=i+1;            }            else                {                end=i-1;            }                    }        return res;          }};
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 对看书没有兴趣怎么办 痴呆老人晚上闹怎么办 高中毕业证没拿怎么办 高考志愿同分怎么办 儿童吃虾过敏怎么办 滑板湿水了怎么办 老员工不听指挥怎么办 手机显示连接itunes怎么办 苹果手机下载不信任怎么办 暗影格斗3进不去怎么办 喝酒第二天头痛怎么办 加油忘记拔枪怎么办 刷机完成后怎么办 苹果8按键音太小怎么办 电脑蓝屏出英文怎么办 win10蓝屏重启怎么办 苹果手机变蓝屏怎么办 nga账号声望不足怎么办 鬃狮蜥胆小咬人怎么办 小狗拉稀脱水了怎么办 泰迪刚到家老叫怎么办 开车遇到拉死人怎么办 斯诺克解不到球怎么办 颈椎和腰椎不好怎么办 车祸肇事者不赔偿怎么办 交强险自赔吃亏怎么办 交通事故保险不结案怎么办 马蚁借呗超出一天还款怎么办 千里追风油太辣怎么办 蛀牙牙肉肿痛怎么办 转转删除的东西怎么办 专票开给了个人怎么办 手机用户密码忘了怎么办 手机用户密码忘记了怎么办 悦借钱账户锁定怎么办 手势密码锁忘了怎么办 农行密码忘了怎么办 小恩爱忘记账号怎么办 乐才忘记密码怎么办 ipad忘记密码停用怎么办 ipad忘记ld密码怎么办