215. 数组中的第K个最大元素
双指针法(双路快速排序法)
class Solution {
public int findKthLargest(int[] nums, int k) {
/**
* 第k大的元素等同于第length - k小的元素
*/
int target = nums.length - k;
return sort(nums, 0, nums.length - 1, target);
}
public int sort(int[] nums, int left, int right, int target){
int p = partition(nums, left, right);
if (p == target){
return nums[p];
}
else if (p < target){
return sort(nums, p + 1, right, target);
}
else {
return sort(nums, left, p - 1, target);
}
}
/**
* 双指针遍历数组,将小于第一个元素的放在左边,大的放在右边
* 这样该元素就是第p小的元素,如果p == target就找到目标
*/
public int partition(int[] nums, int left, int right){
int i = left + 1;
int r = right;
int temp = 0;
while (i <= r){
if (nums[i] <= nums[left]){
i++;
}
else {
temp = nums[r];
nums[r] = nums[i];
nums[i] = temp;
r--;
}
}
temp = nums[left];
nums[left] = nums[r];
nums[r] = temp;
return r;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(logn)
*/
优先队列
import java.util.PriorityQueue;
public class Algorithm {
public static void main(String[] args) {
int[] arr = {3,2,3,1,2,4,5,5,6};
System.out.println(new Solution().findKthLargest(arr, 4));
}
}
class Solution {
public int findKthLargest(int[] arr, int k) {
/**
* 寻找最大的第k个元素
* 先将前k个元素放进堆中,然后将后面的元素和堆的最小值进行比较,如果比最小值大,说明这个最小值不是目标元素,就删除它,直到找到最大的k个元素
* Java默认的优先队列,使用的就是最小堆
*/
PriorityQueue<Integer> heap = new PriorityQueue();
for (int i = 0; i < k; i++) {
heap.add(arr[i]);
}
for (int i = k; i < arr.length; i++) {
if (arr[i] > heap.peek()) {
heap.poll();
heap.add(arr[i]);
}
}
return heap.peek();
}
}
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/