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]
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
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