题目介绍

题解
基于快速排序的选择方法
以中间元素pivot为基准进行排序后,右指针 r 的位置就是最终全部排序好后pivot的位置,然后去左边或右边递归寻找第k个位置(答案)的元素。
代码如下:
class Solution {
public int findKthLargest(int[] nums, int k) {
int n = nums.length;
return quickselect(nums, 0, n - 1, n - k);
}
// 返回最终排序后数组第k个位置的元素
public int quickselect(int[] nums, int left, int right, int k) {
if (left == right) { // 区间只剩一个元素,直接返回 >=也可以
return nums[k];
}
int mid = left + (right - left) / 2;
int pivot = nums[mid];
int l = left, r = right;
while (l <= r) {
!!!不能用<=,是为了防止中轴值(pivot)被多次交换
while (nums[l] < pivot)
l++;
while (nums[r] > pivot)
r--;
if (l <= r) {
swap(nums, l, r);
l++;
r--;
}
}
// 递归处理左半部分或右半部分
if (k <= r) {
return quickselect(nums, left, r, k); // 目标在左半部分
} else {
return quickselect(nums, l, right, k); // 目标在右半部分
}
}
public void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
1172

被折叠的 条评论
为什么被折叠?



