剑指 Offer 40. 最小的k个数

Posted dtwd886

tags:

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

题目链接:

https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/

思路:快速排序的变形

方法一:

class Solution 
public:
    vector<int>result;
    int findNum(vector<int>& arr,int k,int left,int right)
    
        int temp=arr[left];
        while(left<right)
        
            while(left<right&&arr[right]>=temp)
            
                right--;
            
            arr[left]=arr[right];
            while(left<right&&arr[left]<=temp)
            
                left++;
            
            arr[right]=arr[left];
        
        arr[left]=temp;
        return left;
    
    void QSort(vector<int>&arr,int k,int l,int r)
    
         if(l<=r)
        
            int low=findNum(arr,k,l,r);
            if(low+1-l<k)
            
                for(int i=l;i<=low;i++)
                    result.push_back(arr[i]);
                QSort(arr,k-low-1+l,low+1,r);
            
            else if(low+1-l==k)
            
                for(int i=l;i<=low;i++)
                    result.push_back(arr[i]);
                return;
            

            else  QSort(arr,k,l,low-1);
        
    
    vector<int> getLeastNumbers(vector<int>& arr, int k) 
        int len=arr.size();
        QSort(arr,k,0,len-1);
        return result;
    
;

方法二:

class Solution 
public:
    int findNum(vector<int>& arr,int k,int left,int right)
    
        int temp=arr[left];
        while(left<right)
        
            while(left<right&&arr[right]>=temp)
            
                right--;
            
            arr[left]=arr[right];
            while(left<right&&arr[left]<=temp)
            
                left++;
            
            arr[right]=arr[left];
        
        arr[left]=temp;
        return left;
    
    vector<int> QSort(vector<int>&arr,int k,int l,int r)
    
            int low=findNum(arr,k,l,r);
            while(low!=k-1)
            
                if(low+1<k)l=low+1;
                else r=low-1;
                low=findNum(arr,k,l,r);
            
            return vector<int>(arr.begin(),arr.begin()+k);
    
    vector<int> getLeastNumbers(vector<int>& arr, int k) 
        int len=arr.size();
        if(k==0)return vector<int>();
        return QSort(arr,k,0,len-1);
    
;

 

以上是关于剑指 Offer 40. 最小的k个数的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer--40最小的k个数

剑指 Offer 40. 最小的k个数

剑指 Offer 40. 最小的k个数

[剑指 Offer 40]. 最小的 k 个数

[剑指 Offer 40]. 最小的 k 个数

「LeetCode」剑指 Offer 40. 最小的k个数