0215. Kth Largest in Array
Medium | Array + Sort + QuickSelect | 40 ms (98.02%), 14.1 MB (94.93%)
Input: nums = [3,2,1,5,6,4], k = 2
Output: 5
Input: nums = [3,2,3,1,2,4,5,5,6], k = 4
Output: 4class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
# (base case)
if len(nums) == 1: return nums[0]
# ==================================================
# Quickselect =
# ==================================================
# time : O(n)
# space : O(1)
self.nums = nums
self.quickSelect(0, len(nums) - 1, k - 1)
return self.nums[k-1]
# (Return top-k largest elements)
# return self.nums[:k]
def quickSelect(self, left, right, kLargest) -> None:
if not (left < right): return
pivot = self.partition(left, right)
if pivot == kLargest: return
elif pivot > kLargest: self.quickSelect(left, pivot-1, kLargest)
else: self.quickSelect(pivot+1, right, kLargest)
def partition(self, left, right) -> int:
randomNum = (left + right) // 2
# move pivot to the end/right
pivot = right
self.nums[randomNum], self.nums[pivot] = self.nums[pivot], self.nums[randomNum]
# move larger elements to the left
placeP = left
for i in range(left, right):
if self.nums[i] >= self.nums[pivot]:
self.nums[placeP], self.nums[i] = self.nums[i], self.nums[placeP]
placeP += 1
# move back the pivot
self.nums[placeP], self.nums[pivot] = self.nums[pivot], self.nums[placeP]
return placePLast updated