求数组最小的k个元素

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求数组最小的k个元素相关的知识,希望对你有一定的参考价值。

求数组最小的k个元素

基于快排的思想,然后每次随机选一个基准数,前面与快排相同。

后面分治的时候需要特判一下:如果是左区间包含前k个的话就递归。

这里还要说一下,这里先随机的基准数先是丢到左端点,也就是与左端点swap。

然后在里层双指针的时候,注意符号是小于等于,所以a[l]不会被交换过去。

最后把基准数还原即可,也就是swap(a[i],a[l])

时间复杂度 : O ( n ) O(n) O(n)

空间复杂度: O ( l o g n ) O(logn) O(logn)

class Solution 
public:
    vector<int> smallestK(vector<int>& a, int k) 
        srand((unsigned)time(NULL));
        function<void(int,int)> qk = [&](int l,int r)
            if(l>=r) return;
            int i = l,j = r;
            int p = l + rand()%(r-l+1);
            swap(a[l],a[p]);
            int x = a[i];
            while(i<j)
                while(i<j && a[j]>=x) j--;
                while(i<j && a[i]<=x) i++;
                swap(a[i],a[j]); 
            
            swap(a[i],a[l]);
            if(i>k) qk(l,i-1);
            if(i<k) qk(i+1,r);
        ;
        int n = a.size();
        qk(0,n-1);
        return vector<int>(a.begin(),a.begin()+k);
    
;

以上是关于求数组最小的k个元素的主要内容,如果未能解决你的问题,请参考以下文章

求包含每个有序数组(共k个)至少一个元素的最小区间

求最小的k个数

求数组中第K个最大的值

求k个最小元素, 华为

返回最小的k个数

用JAVA语言编译:数组中包含n个整数,从其中找出k个最小的数,写出你能想到的最快的方法!!!