暴力解,复杂度是快排复杂度o(nlogn),空间是o(1)
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(),nums.end(),greater<int>());
return nums[k-1];
}
};
利用快排partition思想,得到更快的方法,使用《算法导论》上的快排算法,引入了多余的交换
class Solution {
public:
int partition(vector<int>& nums,int k, int s, int t){
int i = s - 1;
for(int j = s; j < t; j++){
if(nums[j] > nums[t]){
i++;
swap(nums[j],nums[i]);
}
}
i++;
swap(nums[i],nums[t]);
return i;
}
int find(vector<int>& nums,int k, int s,int t){
int q = partition(nums,k,s,t);
if(q == k - 1) return nums[k-1];
else if(q < k - 1){
return find(nums,k,q+1,t);
}else{
return find(nums,k,s,q-1);
}
}
int findKthLargest(vector<int>& nums, int k) {
return find(nums,k,0,nums.size()-1);
}
};