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.
Example 1:
Input: [3,2,1,5,6,4]
and k = 2 Output: 5
Example 2:
Input: [3,2,3,1,2,4,5,5,6]
and k = 4
Output: 4
Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.
代码:
class Solution {
public int findKthLargest(int[] nums, int k) {
if(k<1||k>nums.length)
return -1;
Arrays.sort(nums);
return nums[nums.length-k];
}
}
方法二:
1、通过三路快排查找元素在排序后数组中的位置
pivot=nums[l]
可以将数组分为<pivot、==pivot、>pivot三部分。
lt是小于pivot的索引值,gt是大于pivot的索引值
nums[0,lt]保存的是<pivot的值,[lt+1,gt-1]保存的是==pivot的值,[gt,r]保存的是>pivot的值
当nums[i]<pivot,保存pivot的第一个索引位置的值与当前遍历到的i的位置的值进行交换,并且i++(说明继续扫描)、lt++(说明多了一个0元素),交换后lt_1的位置为0,i的位置为pivot
当nums[i]==pivot,将nums[i]纳入保存pivot的集合,此时只需要i++(继续向后遍历)就说明保存pivot的集合多了一个元素
当nums[i]>pivot,将i与--gt的位置进行交换,此时就将大于pivot的元素放在了数组末尾,同时前面的--gt操作,也让保存>pivot的数组集合扩大了,说明多了一个元素
2、判断该位置index与目标位置k的关系。
如果k==index,返回nums[k]
如果k<index,说明目标k在所查得的目标索引k的左边,继续从l~index-1中进行查找
如果k>index,说明目标k在目标索引的右边,继续从index+1~r中进行查找
class Solution {
private int res=-1;
public int findKthLargest(int[] nums, int k) {
if(nums.length<=0||k>nums.length)return -1;
findKthLargest(nums,nums.length-k,0,nums.length-1);
return res;
}
//求nums[l,r]中第k大的数字
private void findKthLargest(int[]nums,int k,int l,int r){
int index=partion(nums,l,r);
if(index==k){
res=nums[index];
return;
}else if(index<k){
findKthLargest(nums,k,index+1,r);
}else{
findKthLargest(nums,k,l,index-1);
}
}
//求nums[l]如果按照顺序排完nums数组后所在的位置
private int partion(int[]nums,int l,int r){
int lt=l-1;
int gt=r+1;
int pivot=nums[l];
//保证循环过程中nums[l,lt]保存的是<pivot的数字
//[lt+1,i]保存的是等于pivot的数字
//[gt,r]保存的是大于pivot的数字
for(int i=l;i<gt; ){
if(nums[i]<pivot){
swap(nums,++lt,i++);
}else if(nums[i]==pivot){
i++;
}else{//nums[i]>pivot
if(nums[gt-1]!=nums[i]){
swap(nums,--gt,i);
}else{
gt--;
}
}
}
return lt+1;
}
private void swap(int[] nums,int l,int r){
int temp=nums[l];
nums[l]=nums[r];
nums[r]=temp;
}
}
参考资料:
https://leetcode.com/problems/kth-largest-element-in-an-array/discuss/60294/Solution-explained