我正在尝试解决最大子集和问题的略有不同的变化。我希望找到能够为数组提供最大总和的元素,而不是连续的元素。例如,给定以下数组:
{1,-3,-5,3,2,-7,1}输出应为7(总和最大的子阵列为{1,3,2,1})。
这里是我用来计算最大总和的代码:
onclick="onClick"
当我在同一个数组中一起使用正数和负数时,它可以正常工作。但是,当我只使用负数时问题就开始了 - 输出总是为0.我想这是因为我在调用函数时第一次发送0作为总和。有人可以告诉我应该如何更改我的功能,以便它也只能使用负数。
答案 0 :(得分:3)
您的解决方案不必要地复杂且效率低下(时间复杂度O(2^n)
)。
这是一种简单而有效的(O(N)
时间,O(1)
额外空间)方式:
如果列表中至少有一个非负数,则返回所有正数的总和。
否则返回列表中的最大元素。
以下是一些代码:
def get_max_non_empty_subset_sum(xs):
max_elem = max(xs)
if max_elem < 0:
return max_elem
return sum(x for x in xs if x > 0)
答案 1 :(得分:0)
特殊情况是所有元素都是否定的。在这种情况下,找到最小的负数。这将是你的答案。这可以在O(N)时间复杂度下完成。
PSEUDO CODE
ALLNEG=true
LEAST_NEG= -INFINITY
for number in list:
if number>=0
ALLNEG=false
break
else if number>LEAST_NEG
LEAST_NEG=number
if ALLNEG==true
answer=LEAST_NEG
else
...