代码思路
最简单的就是排序一遍然后直接输出。时间复杂度就是排序的复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
优化就是使用快排思想,不全部排序,而是当找到的位置正好是要求的位置时,直接返回,否则通过判断K和当前位置的大小判断继续排序左边还是右边。这种思想最坏的情况时间复杂度等于直接排序输出的 O ( n l o g n ) O(nlogn) O(nlogn)。emmm平均时间复杂度不会证,又或者说太麻烦了懒得想。
代码:
class Solution {
public:
int quicksort(vector<int> &a,int l,int r,int k){
//递归解决问题
if(l == r) return a[l];
int i = l,j = r,base = a[l];
while(i != j){
//快排思想
while(i < j && a[j] >= base) j--; //左边基准,右边先搜
while(i < j && a[i] <= base) i++;
if(i<j) swap(a[i],a[j]);
}
swap(a[i],a[l]);
if(i == k) return a[k]; //找到后直接返回
else if(i > k) return quicksort(a,l,i-1,k); //向两边找
else return quicksort(a,i+1,r,k);
}
int findKthLargest(vector<int>& nums, int k) {
//寻找第k大
return quicksort(nums,0,nums.size()-1,nums.size()-k);
}
};