给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4
提示:
1 <= k <= nums.length <= 105-104 <= nums[i] <= 104
题解: 使用大根堆
调用:
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer>q=new PriorityQueue<>((o1,o2)->(o2-o1));
for(int num:nums)
q.add(num);
int result=0;
while(k--!=0){
result=q.poll();
}
return result;
}
}
实现大根堆:
class Solution {
public int findKthLargest(int[] nums, int k) {
//大根堆
int heapsize=nums.length;
buildMaxheap(nums,heapsize);
for(int i=nums.length-1;i>=nums.length-k+1;i--) {
swap(0,i,nums);
--heapsize;
maxHeapify(nums,0,heapsize);
}
return nums[0];
}
public void buildMaxheap(int []a,int heapsize){
//建立一个大根堆
for(int i=heapsize/2;i>=0;i--){
//比较调整
maxHeapify(a,i,heapsize);
}
}
public void maxHeapify(int []a,int i,int heapsize){
int l=i*2+1,r=i*2+2,largest=i;
if(l<heapsize&&a[l]>a[largest]){
largest=l;
}
if(r<heapsize&&a[r]>a[largest]){
largest=r;
}
if(largest!=i){
swap(largest,i,a);
maxHeapify(a,largest,heapsize);
}
}
public void swap(int a,int b,int []arr){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
}