1堆
2队列
最大优先队列,无论入队顺序,当前最大的元素优先出队。
最小优先队列,无论入队顺序,当前最小的元素优先出队。
3例题
3.1优先队列或红黑树(TreeSet)解法
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> queue = new PriorityQueue<>();
Arrays.stream(nums).forEach(num -> {
//维护一个size为k的优先队列(最小堆)
if (queue.size() >= k) {
//当前值大于优先队列最小元素时,入队
if (num > queue.peek()) {
queue.poll();
queue.offer(num);
}
} else {
queue.offer(num);
}
});
return queue.peek();
}
3.2快排思想解法
private int partition(int[] nums, int start, int end, int k) {
if (start >= end)
return nums[start];
int left = start;
int right = end;
int tmp = nums[left];
while (left < right) {
while (nums[right] > tmp && left < right) {
right--;
}
if (left < right) {
nums[left] = nums[right];
left++;
}
while (nums[left] < tmp && left < right) {
left++;
}
if (left < right) {
nums[right] = nums[left];
right--;
}
}
nums[left] = tmp;
if (nums.length - k == left) {
return nums[left];
} else if (nums.length - k < left) {
return partition(nums, start, left - 1, k);
} else {
return partition(nums, right + 1, end, k);
}
}