查找长度小于或等于 L 的 n 的所有分区

Posted

技术标签:

【中文标题】查找长度小于或等于 L 的 n 的所有分区【英文标题】:Find all partitions of n of length less-than-or-equal to L 【发布时间】:2022-01-23 17:29:04 【问题描述】:

我怎样才能找到长度小于或等于Ln 中的所有partitions?

【问题讨论】:

【参考方案1】:

根据给定的代码here,我们可以包含一个额外的参数L(默认为n)。

我们可能会天真地将if len((i,) + p) <= L: 包含在yield (i,) + p 之前。但是,由于len((i,) + p) = 1 + len(p),任何大于L-1n-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=1for 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 的所有分区的主要内容,如果未能解决你的问题,请参考以下文章

P2727 Stringsobits

2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k

O(N)求数组中小于等于K的最大子数组长度

which命令

为什么HashMap中链表长度超过8会转换成红黑树

算法总结之 未排序数组中累加和小于或等于给定值的最长子数组长度