一.题目描述
给定整数数组 nums
和整数 k
,请返回数组中第 k
个最大的元素。
请注意,你需要找的是数组排序后的第 k
个最大的元素,而不是第 k
个不同的元素。
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
二.代码
Random random = new Random();
public int findKthLargest(int[] nums, int k) {
int len = nums.length;
int target = len - k;
int left = 0;
int right = len - 1;
while (true) {
int index = partition(nums, left, right);
if (index < target) {
left = index + 1;
} else if (index > target) {
right = index - 1;
} else {
return nums[index];
}
}
}
private int partition(int[] nums, int i, int j) {
if (j > i) {
int randomIndex = i + 1 + random.nextInt(j - i);
swap(nums, i, randomIndex);
}
int num = nums[i];
int left = i;
while (i < j) {
while (i < j && nums[j] > num) {
j--;
}
while (i < j && nums[i] <= num) {
i++;
}
if (i != j) {
swap(nums, i, j);
}
}
nums[left] = nums[i];
nums[i] = num;
return i;
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}