最小的k个数

题目描述
输入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;      
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值