给定整数数组 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;
- }
- }