计算分区等子集和问题的时间复杂度

问题描述

def group(arr):
    s1 = []
    s2 = arr

    _sum = sum(arr)
    if _sum & 1:
        return None,None
    n,memo = len(arr),{0: True}
    arr.sort(reverse=True)

    def dfs(i,new_sum):
        if new_sum not in memo:
            memo[new_sum] = False
            if new_sum > 0 or new_sum < 0:
                for j in range(i,n):
                    if dfs(j + 1,new_sum - arr[j]):
                        memo[new_sum] = True
                        s1.append(arr[j])
                        s2.remove(arr[j])
                        break
        return memo[new_sum]

    k = dfs(0,_sum >> 1)  # call recursive func
    if not k:
        return None,None
    return s1,s2

s = [2,8,5,5]
group(s)

以上函数结合了 DFS 的用法和我从 https://leetcode.com/problems/partition-equal-subset-sum/discuss/276278/Python-DP-and-(DFS%2BMemo) 中采用的 Memoization 并对其进行了稍微修改解决以下挑战:

  1. 说明

S 是一组至少 2 个没有特定顺序的整数。问题是是否有办法将 S 分成 2 个集合(S1 和 S2),使得 S1 中的整数之和等于 S2 中的整数之和。 S 中的元素必须始终在 S1 或 S2 中,但不能同时在两者中。在某些情况下,同一个 S 可能有多种解决方案。

  1. 挑战

编写一个名为 group 的函数,它接受 S,并返回 (None,None)(如果没有解决方案)或一个解决方案(S1,S2)。 group 返回 2 个列表。 (Python 中的函数可能返回 2 个值 - 请参阅此处的示例)。如果有多种解决方案,则只需返回其中一种。

  1. 问题

我在推导函数的时间复杂度时遇到了麻烦,因为我不太擅长递归……谁能解释/指导我完成计算上述时间复杂度 O(n) 的过程?

非常感谢您的帮助、时间和精力。非常感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)