题目描述
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) {
//此方法是直接使用PriorityQueue这个数据结构,构造一个最大堆。然后每次弹出堆顶元素(当前队列的最大元素)直到第k个元素弹出,即为所求
int cn = 0;
if(nums.length == 0) return 0;
int n = nums.length;
PriorityQueue<Integer> queue = new PriorityQueue(new Comparator<Integer> (){
public int compare(Integer a, Integer b){
return b-a;
}
});
for(int i=0; i < n; i++) {
queue.add(nums[i]);
}
while(!queue.isEmpty() && k!=0){
cn = queue.poll();
k--;
}
return cn;
}*/
/**
使用快速排序的思想。一个数列[s...v],选取其中一个元素k,进行一次排序:[a..b] k [c..d]。如图,以k为分界点划分为[a..b]和[c..d]两部分。接着判断k的下标是否是n-k。如果不是,且下标(记为pos)pos > n-k, 则在[a.. b]处再次进行排序;若pos<n-k,则在[c..d]排序
**/
public int findKthLargest(int[] nums, int k){
if(nums.length == 0) return -1;
return quickSort(nums,k,0,nums.length-1);
}
public int quickSort(int[] nums, int k, int start, int end){
int temp = nums[start];
int i = start, j = end; //[i, j] = [i,start1] pos [end1,j];
while(i < j){
while(nums[j] > temp && i < j){
j--;
}
if( i < j) nums[i++] = nums[j];
while(nums[i] < temp && i < j){
i++;
}
if( i < j) nums[j--] = nums[i];
}
nums[i] = temp;
if(i < nums.length - k ) return quickSort(nums,k,i+1,end);
else if(i > nums.length - k) return quickSort(nums,k,start,i-1);
else return temp;
}
}