给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2
输出: 5
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解、双路快排解决问题,其中每次排序pivotIndex是元素所在索引,而本题按升序排列后,所求位置索引为nums.length - k。
class Solution{
private final 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 pivotIndex = partition(nums, left, right);
if(pivotIndex == target) return nums[target];
else if(pivotIndex > target){
right = pivotIndex - 1;
}
else if(pivotIndex < target){
left = pivotIndex + 1;
}
}
}
public int partition(int[] nums, int left, int right){
int randomIndex = random.nextInt(right - left + 1) + left;
swap(nums, randomIndex, left);
int pivot = nums[left];
int le = left + 1;
int ge = right;
while(true){
while(le <= ge && nums[le] < pivot){
le++;
}
while(le <= ge && nums[ge] > pivot){
ge--;
}
if(le >= ge) break;
swap(nums, le, ge);
le++;
ge--;
}
swap(nums, left, ge);
return ge;
}
public void swap(int[] nums, int x, int y){
int temp = nums[x];
nums[x] = nums[y];
nums[y] = temp;
}
}