剑指 Offer 40. 最小的k个数

剑指 Offer 40. 最小的k个数

思路

快排思想+位置判断
在快排中判断:如果快排的分割点的索引恰好是k-1,那么停止递归直接输出前k个数

代码

class Solution {
public:
    int k1;
    void quick_sort(vector<int>& arr,int l,int r)
    {
        if(l<r)
        {
            int i=l;
            int j=r;
            int x=arr[l];
            while(i<j)
            {
                while(i<j&&arr[j]>=x)
                {
                    j--;
                }
                if(i<j)
                {
                    arr[i]=arr[j];
                    i++;
                }
                while(i<j&&arr[i]<x)
                {
                    i++;
                }
                if(i<j)
                {
                    arr[j]=arr[i];
                    j--;
                }
            }
            arr[i]=x;
            if(i!=k1-1)
            {
                quick_sort(arr,l,i-1);
                quick_sort(arr,i+1,r);
            }
            
        }
    }
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        k1=k;
        quick_sort(arr,0,arr.size()-1);
        vector<int> res(arr.begin(),arr.begin()+k);
        return res;
    }
};

posted @ 2020-10-22 19:07  韩天尊  阅读(60)  评论(0)    收藏  举报