牛客题霸 [寻找第K大] C++题解/答案

题目描述

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

题目:

利用快排+二分

题解:

class Finder {
   
public:
    int findKth(vector<int> a, int n, int K) {
   
        // write code here、
        return find(a,0,n-1,n-K+1);
    }
    int find(vector<int>&a,int l,int r,int K)
    {
   
        if(l==r) return a[l];
        int i=l-1;
        int j=r+1;
         
        int x=a[l+r>>1];
        
        while(i<j)
        {
   
            do i++;while(a[i]<x);
            do j--;while(x<a[j]);
            if(i<j) swap(a[i],a[j]);
        }
        int s=j-l+1;
        if(K<=s) return find(a,l,j,K);
        else return find(a,j+1,r,K-s);
    }
};