问题:
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
For example,
Given [3,2,1,5,6,4] and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array’s length.
思路一:最简单粗暴就是对数组进行排序,然后就可以找到第K大的值,例如采用快速排序
class Solution {
public int findKthLargest(int[] nums, int k) {
//快速排序
int len = nums.length;
dfs(nums,0,len-1);
return nums[len-k];
}
public void dfs(int []nums,int start,int end){
if(start<end){
int i = start;
int j = end;
int key = nums[start];
while(i<j){
while(j>i && nums[j]>key)j--;
if(i<j){
swap(nums,i,j);
}
while(i<j && nums[++i]<key);
if(i<j){
swap(nums,i,j);
}
}
dfs(nums,start,i-1);
dfs(nums,j+1,end);
}
}
public void swap(int[]nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
思路二:直接采用优先队列的方法,优先队列默认建立小顶堆
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> queue = new PriorityQueue<>();//创建优先队列
for(int i = 0;i<nums.length;i++){
queue.offer(nums[i]);//入队操作
if(queue.size()>k)queue.poll();//判断队列长度是否大于K
}
return queue.poll();//返回第K个最大值
}
}