题目描述
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
解决思路
快排
根据快排,找到第k个大小则返回结果,这里应该是从大到小。时间复杂度为O(n),前提是需要数组打乱,如果数组是有序的,则复杂度越高,为O(n2)。在快排的partition中,最容易犯的错误:两个指针i和j,i指向比第一个元素大的,j指向比第一个元素小的,在返回partition的值时,应该选择j,如果选择i时,则有可能将较小的元素移动到前面,如果选择j时,依然是比它大的元素替换,一定要警记这一点。
递归
public int findKthLargest(int[] nums, int k) {
if(k > nums.length || k <1)
return -1;
return sort(nums, 0, nums.length-1, k);
}
private int sort(int[] nums,int lo,int hi, int k) {
if(lo == hi)
return nums[lo];
int partition = partition(nums, lo, hi);
if(partition == k-1) {
return nums[partition];
}else if(pa