//1.使用最小堆,或最大堆
// 根据 k 的不同,选最大堆和最小堆,目的是让堆中的元素更小
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> queue = new PriorityQueue<>();
for(int num : nums){
queue.add(num);
//如果队列的容量已经超过 K个,那么弹出堆顶元素,内部的元素由堆来调整
if(queue.size() > k){
queue.poll();
}
}
return queue.peek();
}
}
//2.使用快排
class Solution {
public int findKthLargest(int[] nums, int k) {
int len = nums.length;
int left = 0;
int right = len - 1;
int target = len - k;
while(true){
int index = partition(nums,left,right);
if(index == target){
return nums[index];
}else if( index < target){
left = index + 1;
}else{
right = index - 1;
}
}
}
public int partition(int[] nums,int left,int right){
// pivot为基准位
int pivot = nums[left];
int j = left;
for(int i = left + 1;i <= right;i++){
if(nums[i] < pivot){
//小于 pivot 的元素 都被交换到前面
j++;
swap(nums,j,i);
}
}
//在之前的遍历过程中,满足[left+1,j] < pivot, 并且(j,i] >= pivot
swap(nums,j,left);
//交换以后 [left,j - 1] < piovt , nums[j] = piovt,[j + 1,right] >= piovt
return j;
}
//交换nums[i] 与 nums[j]的位置
public void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}