leetcode215.数组中的第k个最大元素
思路源于
7-2「力扣」第 215 题:数组中的第 K个最大元素
基于快速排序思路的一种求解,我们的问题是求解第k个最大的元素,那么也就是排序后数组下标索引在n-k的位置
快速排序中我们随机选择一个轴值,左边的元素都小于他,右边的元素都大于他,然后返回这个下标索引(分割点),如果这个分割点恰好是n-k那么这就是最终结果,如果分割点比n-k小那么说明答案应该在右边的区间,反之答案就在左边的区间
如果都没找到说明k肯定不合法直接返回-1
class Solution {
private Random random = new Random();
private int partition(int[] nums, int left, int right) {
// 随机选择基准元素的索引
int randomIndex = left + random.nextInt(right - left + 1);
// 将随机选择的基准元素放到 left 位置
swap(nums, randomIndex, left);
while (left < right) {
while (left < right && nums[left] <= nums[right]) {
right--;
}
if (left < right) {
swap(nums, left, right);
left++;
}
while (left < right && nums[left] <= nums[right]) {
left++;
}
if (left < right) {
swap(nums, left, right);
right--;
}
}
return left;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public int findKthLargest(int[] nums, int k) {
int target = nums.length - k;
int left = 0, right = nums.length - 1;
while (left <= right) {
int pivotPos = this.partition(nums, left, right);
if (pivotPos == target) {
return nums[pivotPos];
} else if (pivotPos < target) {
left = pivotPos + 1;
} else {
right = pivotPos - 1;
}
}
return -1;
}
}