在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用了三路快排实现 但是对于这道题来讲双路快排要快一些。
class Solution {
public int findKthLargest(int[] nums, int k) {
Random rnd = new Random();
return Sort(nums, 0, nums.length-1, rnd, k);
}
private static int Sort(int[] arr, int l, int r, Random rnd, int k) {
if (l >= r){
return (r == k-1) ? arr[r] : -1;
}
int p = l + rnd.nextInt(r-l+1);
swap(arr, l, p);
// arr[l+1, lt] > 0 || arr[lt+1, i-1] =0 || arr[gt, r] < 0
int lt = l, gt = r+1, i = l+1;
while (i < gt) {
if (arr[i] > arr[l]) {
lt++;
swap(arr, lt, i);
i++;
} else if (arr[i] == arr[l]) {
i++;
} else {
gt--;
swap(arr, gt, i);
}
}
// 将l与lt交换
swap(arr, l, lt);
// 数组变为 arr[l, lt-1] > 0 || arr[lt, gt-1] = 0 || arr[gt, r] < 0
if (lt <= k-1 && gt-1 >= k-1)
return arr[lt];
else if (lt < k-1) {
return Sort(arr, gt, r, rnd, k);
} else {
return Sort(arr, l, lt-1, rnd, k);
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {3,3,3,3,3,3,3,3,3};
System.out.println(new Solution().findKthLargest(arr, 8));
}
}