215 - Kth Largest Element in an Array
Written on October 21, 2015
Tweet
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example, given [3,2,1,5,6,4] and k = 2, return 5.
class Solution {
//param k : description of k
//param numbers : array of numbers
//return: description of return
public int kthLargestElement(int k, ArrayList<Integer> numbers) {
// write your code here
if (numbers == null || numbers.size() == 0) return 0;
return helper(k, numbers, 0, numbers.size() - 1);
}
public int helper(int k, ArrayList<Integer> numbers, int start, int end) {
int lo = start, hi = end, pivot = end;
while (lo <= hi) {
while (lo <= hi && numbers.get(lo) < numbers.get(pivot)) {
lo ++;
}
while (lo <= hi && numbers.get(hi) >= numbers.get(pivot)) {
hi --;
}
if (lo <= hi) {
Collections.swap(numbers, lo, hi);
}
}
Collections.swap(numbers, lo, pivot);
if (lo == numbers.size() - k) {
return numbers.get(lo);
} else if (lo > numbers.size() - k) {
return helper(k, numbers, start, lo - 1);
} else {
return helper(k, numbers, lo + 1, end);
}
}
};
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
if not nums:
return -1
return self.helper(nums, k, 0, len(nums) - 1)
def helper(self, nums, k, start, end):
lo, hi, pivot = start, end, end
while lo < hi:
if nums[lo] < nums[pivot]:
lo += 1
continue
if nums[hi] >= nums[pivot]:
hi -= 1
continue
nums[lo], nums[hi] = nums[hi], nums[lo]
nums[lo], nums[pivot] = nums[pivot], nums[lo]
if lo == len(nums) - k:
return nums[lo]
elif lo > len(nums) - k:
return self.helper(nums, k, start, lo - 1)
else:
return self.helper(nums, k, lo + 1, end)