求数组最小的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个元素的主要内容,如果未能解决你的问题,请参考以下文章