题目
解题思路:
由于是求第K大的数,可以自然想到是排序,又要求是O(n)的算法
堆排序中的向下调整就满足
代码:
class Solution {
public int findKthLargest(int[] nums, int k) {
return KthSorted(nums,k,nums.length);
}
public int KthSorted(int[] nums,int k,int len)
{
//第一次构建大根堆
for(int i = (len - 1) / 2 ;i>=0;i--)
{
KthMakeHeep(nums,i,len-1);
}
//堆排序,排序k次后,返回当前的元素
for(int i = 0;i<k;i++)
{
int temp = nums[len - i - 1];
nums[len - i - 1] = nums[0];
nums[0] = temp;
KthMakeHeep(nums,0,len - i - 1 - 1);
}
return nums[len - k];
}
public void KthMakeHeep(int[] nums,int begin,int end)
{
int tmp = nums[begin];
for(int i = begin * 2 + 1;i<=end;i=i*2+1)
{
if(i < end && nums[i] < nums[i+1])
{
i++;
}
if(tmp < nums[i])
{
nums[begin] = nums[i];
begin = i;
}
else
{
break;
}
}
nums[begin] = tmp;
}
}
我的堆排序详解https://blog.csdn.net/manfulshark/article/details/140001761?spm=1001.2014.3001.5501