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
知道ugly in uglies>n
不会小于{{uglies[n-1]
1}}。
答案 0 :(得分:0)
需要n 已经排序的迭代。然后,它可以查看每个中的最小值并使用它。最小的一个始终是第一个项目,然后是第二个项目,然后是第三个项目,因为它们都是排序的。
答案 1 :(得分:0)
heapq.merge
的实现是纯Python,如果需要,可以直接read its code。
正如您可能从其实现的模块中猜到的那样,它使用堆来合并它传递的迭代。如果迭代(在这种情况下为生成器)按顺序产生它们的值,它将组合它们,以便它产生的值也是有序的。它不会消除重复值,这就是您显示的代码检查最新值是否等于前一个值的原因。