classSolution:deffindKthLargest(self, nums, k):defquick_sort(nums, k):pivot = random.choice(nums)big, equal, small =[],[],[]for num in nums:if num > pivot:big.append(num)elif num < pivot:small.append(num)else:equal.append(num)if k <=len(big):# 第 k 大元素在 big 中,递归划分return quick_sort(big, k)if k >len(nums)-len(small):# 第 k 大元素在 small 中,递归划分return quick_sort(small, k-len(nums)+len(small))return pivot # 第 k 大元素在 equal 中,直接返回 pivotreturn quick_sort(nums, k)
代码2:堆
classSolution:deffindKthLargest(self, nums: List[int], k:int)->int:pq =[]# 将数组加入小顶堆,堆中维护当前值最大的k个数for num in nums:heapq.heappush(pq, num)# 当前元素入堆iflen(pq)> k:heapq.heappop(pq)# 堆中元素超过k个,弹出最小的那个return pq[0]# 最后堆顶的即为第k大的数
二、347. 前 K 个高频元素
思路: 用字典保存每个数字出现次数,最后排序key
代码:
classSolution:deftopKFrequent(self, nums: List[int], k:int)-> List[int]:# 使用 defaultdict 统计每个元素出现的次数coll_dea = collections.defaultdict(int)for i in nums:coll_dea[i]+=1# 按频率排序(从高到低),然后取前 k 个元素sorted_items =sorted(coll_dea.items(), key=lambda x: x[1], reverse=True)ans =[item[0]for item in sorted_items[:k]]# 提取前 k 个元素的值return ans