即使不生成列表,heapq.merge()
如何对列表排序?在
不知道我说的是否清楚。
所以,这是从
Super Ugly Number problem at leetcode。在
还有这个python代码
class Solution(object):
def nthSuperUglyNumber(self, n, primes):
"""
:type n: int
:type primes: List[int]
:rtype: int
"""
uglies = [1]
def gen(prime):
for ugly in uglies:
yield ugly * prime
merged = heapq.merge(*map(gen, primes))
while len(uglies) < n:
ugly = next(merged)
if ugly != uglies[-1]:
uglies.append(ugly)
return uglies[-1]
让我很难理解。在我搜索了“yield”和“heapq”的概念之后,在while
循环中,我仍然没有得到这个结果,merged
怎么知道{
heapq.merge
的实现是纯Python,如果需要,可以直接read its code。在从实现它的模块中可以猜到,它使用堆来合并传递的iterable。如果iterables(本例中的生成器)按顺序生成各自的值,那么它将把它们组合在一起,以便它生成的值也按顺序排列。它不能消除重复值,这就是为什么显示的代码检查最新值是否等于前一个值。在
它需要n已经排序的个项目。然后,它可以查看每个值中的最小值并使用它。最小的一个总是第一个项目,然后是第二个项目,然后是第三个项目,因为每个项目都是排序的。在
相关问题 更多 >
编程相关推荐