查找长度小于或等于 L 的 n 的所有分区
Posted
技术标签:
【中文标题】查找长度小于或等于 L 的 n 的所有分区【英文标题】:Find all partitions of n of length less-than-or-equal to L 【发布时间】:2022-01-23 17:29:04 【问题描述】:我怎样才能找到长度小于或等于L
的n
中的所有partitions?
【问题讨论】:
【参考方案1】:根据给定的代码here,我们可以包含一个额外的参数L
(默认为n
)。
我们可能会天真地将if len((i,) + p) <= L:
包含在yield (i,) + p
之前。但是,由于len((i,) + p) = 1 + len(p)
,任何大于L-1
的n-i
分区都将被丢弃。因此,寻找它们是浪费时间。相反,我们应该在查找n-1
的分区时包含L=L-1
作为参数。然后我们需要通过不运行主体来正确处理L=0
的情况:
def partitions(n, L=None, I=1):
if L is None:
L = n
if L:
yield (n,)
for i in range(I, n//2 + 1):
for p in partitions(n-i, L-1, i):
yield (i,) + p
现在如果L=1
,for i
循环将被执行,但for p
循环将不会执行,因为partitions
调用不会产生任何结果;在这种情况下我们根本不需要执行for i
循环,这样可以节省很多时间:
def partitions(n, L=None, I=1):
if L is None:
L = n
if L == 1:
yield (n,)
elif L > 1:
yield (n,)
for i in range(I, n//2 + 1):
for p in partitions(n-i, L-1, i):
yield (i,) + p
【讨论】:
以上是关于查找长度小于或等于 L 的 n 的所有分区的主要内容,如果未能解决你的问题,请参考以下文章
2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k