topk 问题

对于固定数量的数据,堆排序和快速排序都可以,数据流就用堆排序

//堆排序:
class Solution
{
    int findKthLargest(int k , vector<int>& nums)
    {
        priority_queue<int,vector<int>,greater<int>> p ;
        for(auto n : nums)
        {
            p.push(n) ;
            if(p.size() > k) p.pop() ;
        }
        return (p.empty() ? 0 : p.top()) ;
    }
}

//快速排序
int partition(int l , int r , vector<int>& nums)
{
    int pi = (rand() % (r - l + 1)) + l ;
    int pivot = nums[pi] ;
    swap(nums[pivot] , nums[l]) ;
    
    while(l < r)
    {
        while(r > l && nums[r] > pivot) r-- ;
        nums[l] = nums[r] ;

        while(l < r && nums[l] <= pivot) l++ ;
        nums[r] = nums[l] ;
    }

    nums[l] = pivot ;
    return l + 1 ;
}

int quickSort(vector<int> &nums , k , int l , int r)
{
    if(l == r) return nums[l] ;  
    int par = partition(l , r , nums) ;
    if(par == k) return nums[par-1] ;
    else if(par < k) return quickSort(nums , k ,  par , r )
    else return quickSort(nums , k , l , par - 2 ) ;
}

  

posted on 2020-04-12 13:59  景行cmy  阅读(106)  评论(0)    收藏  举报