# Kth Largest Element in an Array O(n): n + k * log(n) ```python= class Solution: def buildHeap(self, array): # Write your code here. firstParentIdx = (len(array)-2) // 2 for currentIdx in reversed(range(firstParentIdx + 1)): self.siftDown(currentIdx, len(array)-1, array) return array def siftDown(self, currentIdx, endIdx, heap): # Write your code here. childOneIdx = currentIdx * 2 + 1 while childOneIdx <= endIdx: childTwoIdx = currentIdx * 2 + 2 if currentIdx * 2 + 2 <= endIdx else -1 if childTwoIdx != -1 and heap[childTwoIdx] > heap[childOneIdx]: idxToSwap = childTwoIdx else: idxToSwap = childOneIdx if heap[idxToSwap] > heap[currentIdx]: heap[currentIdx], heap[idxToSwap] = heap[idxToSwap], heap[currentIdx] currentIdx = idxToSwap childOneIdx = currentIdx * 2 + 1 else: return def findKthLargest(self, nums: List[int], k: int) -> int: nums = self.buildHeap(nums) k -= 1 while k > 0: nums[0], nums[len(nums)-1] = nums[len(nums)-1], nums[0] nums.pop(-1) self.siftDown(0, len(nums)-1, nums) k -= 1 return nums[0] ``` O(nlogk): k + (n-k) * 2 * log(k) ```python= class Solution: def buildHeap(self, array): # Write your code here. firstParentIdx = (len(array)-2) // 2 for currentIdx in reversed(range(firstParentIdx + 1)): self.siftDown(currentIdx, len(array)-1, array) return array def siftUp(self, currentIdx, heap): # Write your code here. parentIdx = (currentIdx-1) // 2 while currentIdx != 0 and heap[parentIdx] > heap[currentIdx]: heap[parentIdx], heap[currentIdx] = heap[currentIdx], heap[parentIdx] currentIdx = parentIdx parentIdx = (currentIdx-1) // 2 def siftDown(self, currentIdx, endIdx, heap): # Write your code here. childOneIdx = currentIdx * 2 + 1 while childOneIdx <= endIdx: childTwoIdx = currentIdx * 2 + 2 if currentIdx * 2 + 2 <= endIdx else -1 if childTwoIdx != -1 and heap[childTwoIdx] < heap[childOneIdx]: idxToSwap = childTwoIdx else: idxToSwap = childOneIdx if heap[idxToSwap] < heap[currentIdx]: heap[currentIdx], heap[idxToSwap] = heap[idxToSwap], heap[currentIdx] currentIdx = idxToSwap childOneIdx = currentIdx * 2 + 1 else: return def insert(self, value, heap): # Write your code here. heap.append(value) self.siftUp(len(heap)-1, heap) def findKthLargest(self, nums: List[int], k: int) -> int: k_l = self.buildHeap(nums[:k]) i = k while i < len(nums): self.insert(nums[i], k_l) k_l[0], k_l[k] = k_l[k], k_l[0] k_l.pop(-1) self.siftDown(0, len(k_l)-1, k_l) i += 1 return k_l[0] ```