大佬题解
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> q = new PriorityQueue<Integer>(k,(a, b)->a - b);
for(int i = 0;i < k; i++){
q.add(nums[i]);
}
for(int i = k; i < nums.length; i++){
Integer top = q.peek();
if(nums[i] > top){
q.poll();
q.add(nums[i]);
}
}
return q.peek();
}
}
import java.util.Random;
public class Solution {
private static Random random = new Random(System.currentTimeMillis());
public int findKthLargest(int[] nums, int k) {
int len = nums.length;
int left = 0;
int right = len - 1;
int target = len - k;
while (true) {
int index = partition(nums, left, right);
if (index == target) {
return nums[index];
} else if (index < target) {
left = index + 1;
} else {
right = index - 1;
}
}
}
public int partition(int[] nums, int left, int right) {
if (right > left) {
int randomIndex = left + 1 + random.nextInt(right - left);
swap(nums, left, randomIndex);
}
int pivot = nums[left];
int lt = left + 1;
int rt = right;
while (true) {
while (lt <= rt && nums[lt] < pivot) {
lt++;
}
while (lt <= rt && nums[rt] > pivot) {
rt--;
}
if (lt > rt) {
break;
}
swap(nums, lt, rt);
lt++;
rt--;
}
swap(nums, left, rt);
return rt;
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
class Solution {
Random random = new Random();
public int findKthLargest(int[] nums, int k) {
return quickSelect(nums, 0, nums.length - 1, nums.length - k);
}
public int quickSelect(int[] a, int l, int r, int index) {
int q = randomPartition(a, l, r);
if (q == index) {
return a[q];
} else {
return q < index ? quickSelect(a, q + 1, r, index) : quickSelect(a, l, q - 1, index);
}
}
public int randomPartition(int[] a, int l, int r) {
int i = random.nextInt(r - l + 1) + l;
swap(a, l, i);
return partition(a, l, r);
}
public int partition(int[] nums, int lo, int hi) {
int v = nums[lo];
int i = lo, j = hi + 1;
while(true){
while(++i <= hi && nums[i] < v);
while(--j >= lo && nums[j] > v);
if(i >= j)
break;
int t = nums[j];
nums[j] = nums[i];
nums[i] = t;
}
nums[lo] = nums[j];
nums[j] = v;
return j;
}
public void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}