对于一个形如A = {1, 2, 3, ..., n}
的集合。如果存在一个大小为k<=n
的集合,满足以下定理,则称其为集合A
的一个划分:
a) 所有划分的并集等于原集合A
b) 任意两个划分的交集为空集(它们不能拥有共同元素)。
例如,对于集合A = {1, 2,... n}
,我们可以得到以下划分:
{1, 2, 3}
{1, 2} {3}
{1, 3} {2}
{2, 3} {1}
{1} {2} {3}
这些理论概念在我的算法教材中介绍(顺便说一下,这个子章节是“回溯”章节的一部分)。我需要找到一个算法来生成给定集合的所有划分。我整天都在苦苦思考这个问题,但是我找不到解决方案。你能否向我解释一下这个算法是如何工作的?同时,你能给我提供一个伪代码草图吗?
{1} {2}
),你需要尝试将新元素添加到每个部分 -- 这样你就会为每个部分创建一个全新的分区。2. 你还需要创建包含新数字单独在一个部分中的分区。 - j_random_hackerprintPartitions
的递归调用中,您传递i > maximum ? i : maximum
。这可以通过观察到,在除了最后一个递归调用之外的所有递归调用中,您只需传递最大值,在最后一个递归调用中,您传递最大值加一来使其更有效率。这会使代码变得简单些。请参见https://ideone.com/6vaXaN。 - rici