您的位置:首页 > 编程语言 > Java开发

Kth Largest Element in an Array LeetCode Java

2015-06-23 15:58 555 查看
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.

刚看这道题目的时候, 首先想法是使用构造大根堆的方式实现。本来想在讨论区参考一下具体做法,但是看了一下讨论区的内容,才恍然大悟,java的priorityQueue不就是通过堆来实现的吗?直接用就好了。。。。

同时,在讨论区看到了一个多个解法的帖子,感觉写的挺不错的,就转过来了(原地址:https://leetcode.com/discuss/36966/solution-explained):

方法一

排序法

public int findKthLargest(int[] nums, int k) {
final int N = nums.length;
Arrays.sort(nums);
return nums[N - k];
}


方法二

priorityQueue

public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> priorityQueue=new PriorityQueue<Integer>();
for(int i:nums){
priorityQueue.add(i);
if(priorityQueue.size()>k){
priorityQueue.poll();
}
}
return priorityQueue.poll();
}


方法三

使用选择算法,其实就是快排用到的思路

public int findKthLargest2(int[] nums,int k){
k=nums.length-k;
int lo=0;
int hi=nums.length-1;
while(lo<hi){
final int j=partition(nums, lo, hi);
if(j<k){
lo=j+1;
}else if(j>k){
hi=j-1;
}else {
break;
}
}
return nums[k];
}
private int partition(int[] a,int lo,int hi){
int i=lo;
int j=hi+1;
while(true){
while(i<hi && less(a[++i], a[lo]));
while(j>lo && less(a[lo], a[--j]));
if(i>=j)
break;
exch(a, i, j);
}
exch(a, lo, j);
return j;
}
private void exch(int[] a,int i,int j){
final int tmp=a[i];
a[i]=a[j];
a[j]=a[i];
}
private boolean less(int v,int w){
return v<w;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: