在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
思路:
其实这个题使用快速排序肯定是可以的,但是因为堆排序在面试中是重点,所以我这一次就重点学习了一下堆排序。
堆排序的的重要思想就是:
形成的时候上移
插入的时候下推
这个题目使用最小堆,巧妙之处就在于,先形成一个k容量的最小堆,然后将k-length-1的数进行比较,如果大于堆顶就假如到堆中。
这样保证了什么呢?当然是到遍历完成后堆顶就是第k大啦,为啥呢,最小堆下面的可都比堆顶大啊,懂了嘛?嘿嘿(●ˇ∀ˇ●)
class Solution {
// 最小堆实现k大
public int findKthLargest(int[] nums, int k) {
//构建最小堆
for(int i=k/2-1;i>=0;i--){
//先将这k个数 ,形成一个最小堆
heapify(nums,i,k);
}
//遍历剩下的数
for(int i=k;i<nums.length;i++){
if(nums[0]>nums[i])
continue;
//先把i给0
swap(nums,0,i);
heapify(nums,0,k);
}
return nums[0];
}
public void heapify(int[] heap,int index,int k){
int temp=index;
//下推重点之处了
while(true){
//先判断左
if(index*2+1<k&&heap[temp]>heap[index*2+1]){
temp=index*2+1;
}
//在判断右
if(index*2+2<k&&heap[index*2+2]<heap[temp]) {
temp = index * 2 + 2;
}
//没有交换过 ,代表顶点就是最小的,不用管了,直接退出break
if(index==temp)
break;
swap(heap,index,temp);
index=temp;
}
}
public void swap(int []heap,int a,int b){
int temp=heap[a];
heap[a]=heap[b];
heap[b]=temp;
}
}