利用快排思想:先确定一个轴点,然后进行交换使得轴点左边的值比轴点小,轴点右边的值比轴点大,当我们找到轴点位于第N-K个位置的时候说明找到第K大的值。也可以反过来逆序。时间复杂度为O(N).
代码如下:
class Solution { public: int findKthLargest(vector<int>& nums, int k) { int index=getKthindex(nums,k,0,nums.size()-1); return nums[index]; } int getKthindex(vector<int>&a,int k,int lo,int hi){ int mi=getPartion(a,lo,hi); if(mi==a.size()-k)return mi; else if(mi<a.size()-k)return getKthindex(a,k,mi+1,hi); else{ return getKthindex(a,k,lo,mi-1); } } int getPartion(vector<int>&a,int lo,int hi){ int pivot=a[lo]; while(lo<hi){ while(lo<hi&&pivot<=a[hi])hi--; swap(a[lo],a[hi]); while(lo<hi&&pivot>=a[lo])lo++; swap(a[lo],a[hi]); } return lo; } };