kth-largest-element-in-an-arrayV2.py (1698B)
1 # Intuition: 2 # Quick Select 3 4 # Approach: 5 # 1) define pivot 6 # a) for each value <= pivot_val: 7 # place in array 8 # move remaining p values to end 9 # replace pointer value with new p_val 10 11 # Time Complexity 12 # WCTC : O(n^2) 13 # ACTC : O(n) 14 15 # Space Complexity 16 17 # NOTE: 18 19 # They added a worst case test case which results in a TLE 20 # when using the quick select approach. What a bunch of jerks. 21 22 # Code: 23 24 import random 25 import heapq 26 27 28 class Solution: 29 def findKthLargest(self, nums: List[int], k: int) -> int: 30 31 if k > 50000 - 1: 32 nums = [-num for num in nums] 33 heapq.heapify(nums) 34 return heapq.nsmallest(k, nums)[-1] * -1 35 36 return self.quickselect(nums, k, 0, len(nums) - 1) 37 38 def quickselect(self, nums, k, lower, upper): 39 if lower == upper: 40 return nums[lower] 41 42 pivot = random.randint(lower, upper) 43 temp = nums[upper] 44 nums[upper] = nums[pivot] 45 nums[pivot] = temp 46 pivot_val = nums[upper] 47 48 filled_to = lower 49 50 for i in range(lower, upper): 51 if nums[i] < pivot_val: 52 temp = nums[filled_to] 53 nums[filled_to] = nums[i] 54 nums[i] = temp 55 filled_to += 1 56 else: 57 continue 58 59 temp = nums[filled_to] 60 nums[filled_to] = nums[upper] 61 nums[upper] = temp 62 63 index_of_pivot = filled_to 64 65 if len(nums) - k == index_of_pivot: 66 return nums[index_of_pivot] 67 elif len(nums) - k > index_of_pivot: 68 return self.quickselect(nums, k, index_of_pivot + 1, upper) 69 else: 70 return self.quickselect(nums, k, lower, index_of_pivot - 1)