繁体   English   中英

检查列表中是否有三个数字合计为目标

[英]Check if there are three numbers in the list that add up to target

我需要创建一个函数,该函数将一个正数列表和一个正数目标作为输入,如果列表中有三个数字加到目标中,则返回True

到目前为止,我已经提出了:

def subsetSum(l, sum):
    found = False
    for i in range(len(l) - 2):
        for j in range(i + 1, len(l) - 1):
            for k in range(j + 1, len(l)):
                return True
    return found

替换:

>>> subsetSum([5, 4, 10, 20, 15, 19], 38)
True

因此4、15和19的总和等于38,这是我的目标。 当我运行此代码时,结果为True

但是,当我运行以下代码时,它仍然显示为True ,尽管数字列表中没有三个数字加起来等于目标,即10。

>>> subsetSum([5, 4, 10, 20, 15, 19], 10)
True

使用itertools.combinations可能是最简单,最有效的解决方案:

from itertools import combinations

def subset_sum(lst, target):
    return len(lst) > 2 and any(sum(x) == target for x in combinations(lst, 3))

例子:

>>> subset_sum([5, 4, 10, 20, 15, 19], 38)
True
>>> subset_sum([10], 38)
False

万一您想坚持自己的代码,可以通过以下方法解决:

def subset_sum(l, target):
    if len(l) < 3:
        return False

    for ki, i in enumerate(l):
        for kj, j in enumerate(l):
            for kk, k in enumerate(l):
                # To make sure we sum elements ONLY on different positions
                if kk != kj and kk != ki and kj != ki and i + j + k == target:
                    return True

    return False

这个解决方案不是很快,但是可以。

您总是返回True。 由于python可以在一个函数中处理多个return语句,因此不需要找到的变量。 摆脱发现,最后返回False。 您需要一个if语句来比较sum和输入值,当满足条件时返回True,否则返回False。 现在,您的代码本质上是返回True的一种复杂方式,您只是在抽象值中进行迭代,而不是将这些值分配给任何值,然后在返回found之前返回True。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM