Kth Largest Element in an Array
Problem Statement
Find the kth largest element in an unsorted array. This can be solved efficiently using a QuickSelect algorithm, a variation of Quick Sort.
Example
Input: nums = [3, 2, 1, 5, 6, 4], k = 2
Output: 5 (the 2nd largest element)
Code
Java
Python
JavaScript
public class Solution {
public int findKthLargest(int[] nums, int k) {
return quickSelect(nums, 0, nums.length - 1, nums.length - k);
}
private int quickSelect(int[] nums, int left, int right, int k) {
if (left == right) return nums[left];
int pivotIndex = partition(nums, left, right);
if (k == pivotIndex) {
return nums[k];
} else if (k < pivotIndex) {
return quickSelect(nums, left, pivotIndex - 1, k);
} else {
return quickSelect(nums, pivotIndex + 1, right, k);
}
}
private int partition(int[] nums, int left, int right) {
int pivot = nums[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (nums[j] <= pivot) {
i++;
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
int temp = nums[i + 1];
nums[i + 1] = nums[right];
nums[right] = temp;
return i + 1;
}
}
def find_kth_largest(nums, k):
def quick_select(left, right, k_smallest):
if left == right:
return nums[left]
pivot_index = partition(left, right)
if k_smallest == pivot_index:
return nums[k_smallest]
elif k_smallest < pivot_index:
return quick_select(left, pivot_index - 1, k_smallest)
else:
return quick_select(pivot_index + 1, right, k_smallest)
def partition(left, right):
pivot = nums[right]
i = left - 1
for j in range(left, right):
if nums[j] <= pivot:
i += 1
nums[i], nums[j] = nums[j], nums[i]
nums[i + 1], nums[right] = nums[right], nums[i + 1]
return i + 1
return quick_select(0, len(nums) - 1, len(nums) - k)
# Example usage
print(find_kth_largest([3, 2, 1, 5, 6, 4], 2)) # 5
function findKthLargest(nums, k) {
function quickSelect(left, right, kSmallest) {
if (left === right) return nums[left];
let pivotIndex = partition(left, right);
if (kSmallest === pivotIndex) {
return nums[kSmallest];
} else if (kSmallest < pivotIndex) {
return quickSelect(left, pivotIndex - 1, kSmallest);
} else {
return quickSelect(pivotIndex + 1, right, kSmallest);
}
}
function partition(left, right) {
let pivot = nums[right];
let i = left - 1;
for (let j = left; j < right; j++) {
if (nums[j] <= pivot) {
i++;
[nums[i], nums[j]] = [nums[j], nums[i]];
}
}
[nums[i + 1], nums[right]] = [nums[right], nums[i + 1]];
return i + 1;
}
return quickSelect(0, nums.length - 1, nums.length - k);
}
// Example usage
console.log(findKthLargest([3, 2, 1, 5, 6, 4], 2)); // 5
Explanation
- Use QuickSelect to partition the array around a pivot.
- Determine if the kth element is in the left or right partition.
- Recursively search only the relevant partition.
- Stop when the pivot index matches the desired position.
Note
Average time complexity is O(n), worst case is O(n²). Space complexity is O(1) as it modifies the array in place.
