思路
class Solution:
def mincostToHireWorkers(self, quality: List[int], wage: List[int], k: int) -> float:
# 1. 计算每个工人单位工作效率所需工资的金钱
# 2.
pairs = sorted( zip(quality, wage), key = lambda p: p[1]/p[0])
# worker_set是候选的工人,默认是按照单位工作质量工资排序的前k个工人
worker_heap = [ -q for q, _ in pairs[:k] ]
heapify(worker_heap)
sum_q = -sum(worker_heap)
# 初始化以第k个工人的平均工资来计算
ans = sum_q * pairs[k-1][4] / pairs[k-1][0]
for q,w in pairs[k:]:
if q < -worker_heap[0]:
replace_q = heapreplace(worker_heap, -q)
sum_q = sum_q + replace_q + q
ans = min(ans, sum_q * (w/q))
return ans
反思复盘:
- 善用
sorted
函数和lambda表达式,快速构建有序元组列表,可以同时遍历多个列表及其比值。 关于heapify最小堆的概念方法:
https://blog.csdn.net/xiaomucgwlmx/article/details/103522410
heapify(heap)
函数,将列表转化为最小堆。(想要最大堆就将列表元素取负)heappush(heap, item)
函数:将item
添加到已有堆中,并自动保持堆的特性。heappop(heap)
:弹出并返回 heap 中的最小元素,保持剩余元素仍符合最小堆特性。heapreplace(heap, item)
:弹出堆中的最小元素,并将 item 加入堆中,是一步操作中完成的。这比单独先 heappop 然后 heappush 更高效,因为它只需要重新平衡一次堆。heappushpop(heap, item)
:先将 item 压入堆中,然后弹出并返回 heap 中的最小元素。这个操作与 heapreplace 相似,但顺序相反。
《十角馆杀人事件》日本剧高清在线免费观看:https://www.jgz518.com/xingkong/9685.html
兄弟写的非常好 https://www.cscnn.com/
想想你的文章写的特别好https://www.ea55.com/