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.
Solution:
1st method using quicksort to sort in non-ascending order, and get the kth number. n = len(nums), time complexity is o(nlogn) -
2nd method. quickselect. set the pivot (e.g. the first element ) and rearrange all the element less than pivot to be in the left, bigger than pivot to be in the right; then compare with the pivot index with k to decide to go next in the left part or right part to recursively do the same thing reference introduction to algorithm texbook or --reference https://en.wikipedia.org/wiki/Selection_algorithm https://discuss.leetcode.com/topic/14611/java-quick-select/2 random algorithm ; Amortized time complexity is o(n), worst case is o(n^2)
1 def select(nums, l, r, index): 2 if r == l: 3 return nums[l] 4 #pivot index 5 pind = random.randint(l, r) 6 nums[l], nums[pind] = nums[pind], nums[l] #move pivot to the beginning of the 7 8 #partition around pivot 9 i = l 10 for j in xrange(l+1, r+1): 11 if nums[j] < nums[l]: 12 i += 1 13 nums[i], nums[j] = nums[j], nums[i] 14 nums[i], nums[l] = nums[l],nums[i] 15 16 if index == i: 17 return nums[i] 18 elif index < i: 19 return select(nums, l, i-1, index) 20 else: 21 return select(nums, i+1, r, index) 22 23 index = len(nums) - k 24 if nums is None or len(nums) < 1: 25 return 0 26 return select(nums, 0, len(nums)-1, index)
3rd method, use heap if built-in heapq is allowed in python,
1 h = [] 2 for n in nums: 3 heapq.heappush(h, -1*n) #min-heap 4 5 for i in range(0, k-1): 6 heapq.heappop(h) 7 8 return -1*heapq.heappop(h)
4th - another method that I have not come up with, which is to use multiset, similar to heap ( it is interesting). --reference https://www.liuchuo.net/archives/3016.