LeetCode-【topK】解题技巧

剑指 Offer II 059. 数据流的第 K 大数值

1.Python默认是小顶堆,也就是pop命令返回的是最小值,而top位是最大值。
2.入堆的时候用原始数值,每入堆一次,就统计一下堆长度,如果超过了k,就pop掉堆顶,也就是说丢弃最小的值,于是堆中始终保持最大的k个数,而堆顶就是第k大的数。

class KthLargest:

    def __init__(self, k: int, nums: List[int]):
        self.k = k
        self.k_arr = []
        for i in nums:
            heapq.heappush(self.k_arr,i)
            if len(self.k_arr) > self.k:
                heapq.heappop(self.k_arr)

    def add(self, val: int) -> int:
        heapq.heappush(self.k_arr,val)
        if len(self.k_arr) > self.k:
            heapq.heappop(self.k_arr)
        return self.k_arr[0]

6039. K 次增加后的最大乘积

class Solution:
    def maximumProduct(self, nums: List[int], k: int) -> int:
        MOD = 10 ** 9 + 7
        # 小根堆
        heapify(nums)
        while k:
            heapreplace(nums, nums[0] + 1)
            k -= 1
        ans = 1
        for num in nums:
            ans = ans * num % MOD
        return ans

2530. 执行 K 次操作后的最大分数

class Solution:
    def maxKelements(self, nums: List[int], k: int) -> int:
        for i in range(len(nums)):
            nums[i] *= -1 #大根堆
        heapify(nums)
        ret = 0
        for _ in range(k):
            ret-=heapreplace(nums,nums[0]//3)
        return ret

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值