简单实现:
运用STL秒实现!
class Solution {
public:
int findKth(vector<int> a, int n, int K) {
// write code here
sort(a.begin(), a.end());
return a[n-K];
}
};
完事!~~~ 当然还可以优化一下!
优化实现:
快排 + 二分法
鉴于快速排序的特点,每一次排序,都会找到一个基准值,左面放比他小的,右面放比它大的,但是快排会对全部数据进行排序(递归,左面和右面),如果重写快排的逻辑,使数据按从大到小的顺序排列,在一次排序后加一次判断:如果基准左面的值个数恰好为k-1个,则基准值就为第K大值;如果左面的值个数小于K-1个,则第K大值不在左面,直接放弃左面的排序,进行右面的排序。
class Solution {
public:
int findKth(vector<int> a, int n, int K) {
// write code here
return SortToFindK(a, 0 , n - 1, K);
}
/** 重写核心逻辑,使排序规则为大数在左,并且只执行一次排序,没有递归逻辑*/
int MySort(vector<int> &a,int low, int hight)
{
int temp = a[low];
while(low < hight)
{
while(low < hight && a[hight] <= temp) hight--;
if(low == hight) break;
else a[low] = a[hight];
while(low < hight && a[low] >= temp) low++;
if(low == hight) break;
else a[hight] = a[low];
}
a[low] = temp;
return low;
}
/**排序筛选逻辑*/
int SortToFindK(vector<int> &a,int low, int hight,int K)
{
/**进行一轮排序,接收基准值位置下标*/
int Key = MySort(a,low,hight);
if(K == Key -low + 1 ) return a[K]; //如果刚好为K+1位置,则找到
else if(Key -low + 1 > K) return SortToFindK(a,low,Key-1,K);
else return SortToFindK(a,Key + 1,hight, K - Key + low - 1 );
}
};