TopK问题

TopK问题有两种常见的解决方式,一种是利用堆,一种是利用快速排序的partition过程。

一,堆

import heapq
class Finder:
    def findKth(self, a, n, K):
        b = list(map(lambda x:-x, a))
        heapq.heapify(b)
        for _ in range(K-1):
            heapq.heappop(b) 
        return -heapq.heappop(b) 

二,随机快排

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        len_nums = len(nums)
        def partition(nums, low, high, pivot):
            l = low - 1
            r = high + 1
            h = low
            while h < r:
                if nums[h] < pivot:
                    l += 1
                    nums[h], nums[l] = nums[l], nums[h]
                    h += 1
                elif nums[h] == pivot:
                    h += 1
                else:
                    r -= 1
                    nums[h], nums[r] = nums[r], nums[h]
            return l+1, r-1
        low = 0
        high = len_nums-1
        while low <= high:
            pivot = random.randint(low, high)
            pi_l, pi_r = partition(nums, low, high, nums[pivot])
            
            if pi_l <= len_nums - k <= pi_r:
                return nums[pi_l]
            elif pi_l > len_nums - k:
                high = pi_l - 1
            elif pi_r < len_nums - k:
                low = pi_r + 1

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值