> 文章列表 > leetcode215. 数组中的第K个最大元素

leetcode215. 数组中的第K个最大元素

leetcode215. 数组中的第K个最大元素

根据快排的分割点,确定k个元素在前面还是后面加快遍历

def partition(arr, low, high):pivot_idx = random.randint(low, high)                   # 随机选择pivotarr[low], arr[pivot_idx] = arr[pivot_idx], arr[low]     # pivot放置到最左边pivot = arr[low]                                        # 选取最左边为pivotleft, right = low, high     # 双指针while left < right:        while left<right and arr[right] >= pivot:          # 找到右边第一个<pivot的元素right -= 1arr[left] = arr[right]                             # 并将其移动到left处while left<right and arr[left] <= pivot:           # 找到左边第一个>pivot的元素left += 1arr[right] = arr[left]                             # 并将其移动到rightarr[left] = pivot           # pivot放置到中间left=right处return leftdef topKSplit(arr, low, high, k):mid = partition(arr, low, high)               # 以mid为分割点【随机选择pivot】if mid == k-1:                                      # 第k小元素的下标为k-1return arr[mid]                                 #【找到即返回】elif mid < k-1:return topKSplit(arr, mid+1, high, k)           # 递归对mid右侧元素进行排序else:return topKSplit(arr, low, mid-1, k)            # 递归对mid左侧元素进行排序n = len(nums)return topKSplit(nums, 0, n-1, n-k+1)                   # 第k大元素即为第n-k+1小元