不要拿最小堆做topk,我上次面试因为用最小堆被挂了
class Solution {
Random random = new Random();
public int findKthLargest(int[] nums, int k) {
return quickSort(nums, 0, nums.length - 1, nums.length - k);
}
int quickSort(int[] nums, int start, int end, int target) {
// 随机以区间内的数组中的某个元素作为flag,进行快排
// 返回该随机元素的下标
int index = randomFlag(nums, start, end);
if (index == target) {
return nums[index];
} else if (index < target) {
return quickSort(nums, index + 1, end, target);
} else {
return quickSort(nums, start, index - 1, target);
}
}
int randomFlag(int[] nums, int start, int end) {
int flag = start + random.nextInt(end - start + 1);
swap(nums, end, flag);
int ed = nums[end];
int st = start - 1;
for (int i = end - 1; i > st; ) {
if(nums[i] <= ed) {
swap(nums, ++st, i);
} else {
i--;
}
}
swap(nums, st + 1, end);
return st + 1;
}
void swap(int[] nums, int first, int second) {
int temp = nums[first];
nums[first] = nums[second];
nums[second] = temp;
}
}
2022/3/12重写
class Solution {
int[] nums;
int len;
Random random = new Random();
public int findKthLargest(int[] nums, int k) {
len = nums.length;
this.nums = nums;
int l = 0;
int r = len - 1;
while(l != r) {
int index = quickSort(l, r);
if(index == len - k) {
return nums[index];
}
if(index < len - k) {
l = index + 1;
} else {
r = index - 1;
}
}
return nums[l];
}
// 随机以范围内的一个数作为分割线,返回这个数的下标
int quickSort(int l, int r) {
int index = l + random.nextInt(r - l);
swap(l, index);
int st = l;
for (int i = l + 1; i <= r; i++) {
if(nums[i] <= nums[l]) {
swap(++st, i);
}
}
swap(st, l);
return st;
}
void swap(int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}