题意:
给你一个无序的数组,让你求第k大元素;
思路:
比较简单的是利用最小堆(优先队列)保存前k大的元素,最后返回堆顶即可。还有一种方法是利用快排分治的方法,判断每次确定的键值是不是所求的元素;
是的话结束递归返回答案,
不是的话:
1.键值是第x大元素(x>k),此时所求元素在键值的右边,继续在右边区间递归。
2.键值是第x大元素(x<k),此时所求元素在键值的左边,继续在左边区间递归(注意修改k的值,k的值应改为k-x);
java代码:
class Solution {
public int findKthLargest(int[] nums, int k) {
return QuickSelect(nums,0,nums.length-1,k);
}
public int QuickSelect(int[] nums, int s, int e,int k){
int temp = nums[s];
int l = s;
int r = e;
while(l<r){
while(l<r&&nums[r]>=temp){
r--;
}
nums[l] = nums[r];
while(l<r&&nums[l]<=temp){
l++;
}
nums[r] = nums[l];
}
nums[l] = temp;
if(e-l+1==k){
return nums[l];
}
else if(e-l+1>k){
return QuickSelect(nums,l+1,e,k);
}
else{
return QuickSelect(nums,s,l-1,k-e+l-1);
}
}
}