文章目录
1. 数组中的第 K 个最大元素(中等)
地址: https://leetcode-cn.com/problems/kth-largest-element-in-an-array
2022/02/18-7/27
做题反思:
方法一:二叉堆(优先队列)【推荐】
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int e : nums) {
pq.offer(e);
if (pq.size() > k) {
pq.poll();
}
}
return pq.peek();
}
}
方法二:快排
class Solution {
public int findKthLargest(int[] nums, int k) {
// shuffle(nums);
int lo = 0, hi = nums.length - 1;
k = nums.length - k;
while (lo <= hi) {
int p = partition(nums, lo, hi);
if (p < k) {
lo = p + 1;
} else if (p > k) {
hi = p - 1;
} else {
return nums[p];
}
}
return -1;
}
// void sort(int[] nums, int lo, int hi) {
// if (lo >= hi) {
// return;
// }
// int p = partition(nums, lo, hi);
// sort(nums, lo, p - 1);
// sort(nums, p + 1, hi);
// }
int partition(int[] nums, int lo, int hi) {
int pivot = nums[lo];
int i = lo + 1, j = hi;
while (i <= j) {
while (j > lo && nums[j] > pivot) {
j--;
}
while (i < hi && nums[i] <= pivot) {
i++;
}
if (i >= j) {
break;
}
swap(nums, i, j);
}
swap(nums, lo, j);
return j;
}
// void shuffle(int[] nums) {
// Random rand = new Random();
// int n = nums.length;
// for (int i = 0; i < n; i++) {
// swap(nums, i, i + rand.nextInt(n - i));
// }
// }
void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
加随机打乱后:
class Solution {
public int findKthLargest(int[] nums, int k) {
shuffle(nums);
int lo = 0, hi = nums.length - 1;
k = nums.length - k;
while (lo <= hi) {
int p = partition(nums, lo, hi);
if (p < k) {
lo = p + 1;
} else if (p > k) {
hi = p - 1;
} else {
return nums[p];
}
}
return -1;
}
// void sort(int[] nums, int lo, int hi) {
// if (lo >= hi) {
// return;
// }
// int p = partition(nums, lo, hi);
// sort(nums, lo, p - 1);
// sort(nums, p + 1, hi);
// }
int partition(int[] nums, int lo, int hi) {
int pivot = nums[lo];
int i = lo + 1, j = hi;
while (i <= j) {
while (j > lo && nums[j] > pivot) {
j--;
}
while (i < hi && nums[i] <= pivot) {
i++;
}
if (i >= j) {
break;
}
swap(nums, i, j);
}
swap(nums, lo, j);
return j;
}
void shuffle(int[] nums) {
Random rand = new Random();
int n = nums.length;
for (int i = 0; i < n; i++) {
swap(nums, i, i + rand.nextInt(n - i));
}
}
void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}