30-最小的K个数

来源:互联网 发布:布鲁克林警察 知乎 编辑:程序博客网 时间:2024/06/17 11:51

一 利用快排 partition

     轴值的下标是k-1的时候,说明前面的K个数就是所求。

   

vector<int> GetLeastNumbers_Solution(vector<int> input, int k)    {        vector<int> result;               if (0 >= input.size() || k > input.size()||k<1)           return result;        int l=0;        int r=input.size()-1;        int index= partition(input,l,r);        while(index!=k-1)            if(index<k-1)            {                l=index+1;                index= partition(input,l,r);            }            else            {                r=index-1;                index= partition(input,l,r);            }         vector<int> res(input.begin(), input.begin() + k);                 return res;                   }    int partition(vector<int> &s,int l,int r)        {        int i=l;        int j=r;        int x=s[i];        while (i<j)        {            while(i<j&&s[j]>=x)                j--;            if(i<j)                {                   s[i]=s[j];                   i++;                }             while(i<j&&s[i]<x)                i++;                if(i<j)                {                   s[j]=s[i];                   j--;                 }        }        s[i]=x;        return i;    }

二 利用最大堆

原创粉丝点击