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.
用quick selecte的方法
//pivot为left
public class Solution {
public int findKthLargest(int[] nums, int k) {
return find(nums, 0, nums.length - 1, nums.length - k);
}
public int find (int[] nums, int i, int j, int k) {
int left = i;
int right = j;
int pivot = nums[left];
while (left < right) {//为< 不是<=
while (left < right && nums[right] > pivot) {//必须先right--
right--;
}
while (left < right && nums[left] <= pivot) {
left++;
}
swap(nums, left, right);
}
swap(nums,right, i);
if (left == k) {
return nums[k];
} else if (left < k) {
return find(nums, left + 1, j, k);
} else {
return find(nums, i, left - 1, k);
}
}
public void swap(int[] nums, int i, int j) {
int tem = nums[i];
nums[i] = nums[j];
nums[j] = tem;
}
}
//pivot为right
public class Solution {
public int findKthLargest(int[] nums, int k) {
return find(nums, 0, nums.length - 1, nums.length - k);
}
public int find (int[] nums, int i, int j, int k) {
int left = i;
int right = j;
int pivot = nums[right];
while (left < right) {
while (left < right && nums[left] < pivot) {//右pivot时候先左边 反之亦然
left++;
}
while (left < right && nums[right] >= pivot) {
right--;
}
if (left < right) {//此判定可有可无, 因为不会出现left> right情况
swap(nums, left, right);
}
}
swap(nums,left, j);
if (left == k) {
return nums[k];
} else if (left < k) {
return find(nums, left + 1, j, k);
} else {
return find(nums, i, left - 1, k);
}
}
public void swap(int[] nums, int i, int j) {
int tem = nums[i];
nums[i] = nums[j];
nums[j] = tem;
}
}
Priority Queue的解法
public class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> queue = new PriorityQueue<Integer>();
for (int i : nums) {
queue.offer(i);
}
for (int i = 0; i < nums.length - k ; i++) {
queue.poll();
}
return queue.peek();
}
}