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)