在数组中找到第k大的元素
注意事项
你可以交换数组中的元素的位置
样例
给出数组 [9,3,2,4,8]
,第三大的元素是 4
给出数组 [1,2,3,4,5]
,第一大的元素是 5
,第二大的元素是 4
,第三大的元素是 3
,以此类推
挑战
要求时间复杂度为O(n),空间复杂度为O(1)
思想利用分治法进行处理:使用快速排序,和快速排序不同的是每次分为两个部分时仅需要考虑其中一个部分,这样就会使得时间复杂度由O(nlogn)降为O(n),这里我并没有使用迭代的写法,因为使用迭代时,数据量很大时内存会不够用。
class Solution {
public:
/*
* @param n: An integer
* @param nums: An array
* @return: the Kth largest element
*/
//快速排序
int quickSort(vector<int> &nums,int begin,int end){
int key=nums[begin];
int first=begin,last=end;
while(first<last){
while(nums[last]>=key&&first<last){
last--;
}
nums[first]=nums[last];
while(nums[first]<=key&&first<last){
first++;
}
nums[last]=nums[first];
}
nums[first]=key;
return first;
}
int kthLargestElement(int n, vector<int> &nums) {
// write your code here
int length=nums.size();
int begin=0,end=length-1;
int flag1=quickSort(nums,begin,end);
while(1){
for(int i=0;i<length;i++)
cout<<nums[i]<<" ";
cout<<endl;
if(length-flag1>n){
begin=flag1+1;
flag1=quickSort(nums,begin,end);
}
else if(length-flag1<n){
end=flag1-1;
flag1=quickSort(nums,begin,end);
}
else
break;
}
for(int i=0;i<length;i++)
cout<<nums[i]<<" ";
return nums[length-n];
}
};