堆是一种特殊的树形数据结构,通常是一个完全二叉树。它分为两种类型:
- 最小堆(Min Heap):根节点的值小于或等于其子节点的值,即根节点存储了堆中的最小值。
- 最大堆(Max Heap):根节点的值大于或等于其子节点的值,即根节点存储了堆中的最大值。
Python 提供了 heapq
模块,它包含了一系列用于堆操作的函数。以下是一些常用的 heapq
函数:
heapify(iterable)
: 将可迭代对象转化为堆。heappush(heap, item)
: 将元素添加到堆。heappop(heap)
: 从堆中弹出最小值。heappushpop(heap, item)
: 先添加元素再弹出最小值,比分别执行heappush
和heappop
更高效。heapreplace(heap, item)
: 先弹出最小值再添加元素,比分别执行heappop
和heappush
更高效。
"""
给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。
在一步 操作 中:
选出一个满足 0 <= i < nums.length 的下标 i ,
将你的 分数 增加 nums[i] ,并且
将 nums[i] 替换为 ceil(nums[i] / 3) 。
返回在 恰好 执行 k 次操作后,你可能获得的最大分数。
向上取整函数 ceil(val) 的结果是大于或等于 val 的最小整数。
"""
from typing import List
import math
import heapq
class Solution:
def maxKelements(self, nums: List[int], k: int) -> int:
# 超时
# ret = 0
# for i in range(k):
# ret += max(nums)
# nums.append(math.ceil(max(nums) / 3))
# nums.remove(max(nums))
# return ret
# 小根堆
ret = 0
nums = [-i for i in nums] # 转换为负数
heapq.heapify(nums) # 建堆
for i in range(k):
m = heapq.heappop(nums) # 弹出堆顶元素
ret += -m
heapq.heappush(nums, - math.ceil(-m / 3)) # 压入新元素
return ret