Python 三个嵌套for循环会降低性能

Python 三个嵌套for循环会降低性能,python,performance,Python,Performance,我想知道是否有其他方法可以解决这个问题,而不必像我在这里做的那样使用3个嵌套for循环?我知道,如果在足够大的列表上测试该方法,以这种方式嵌套循环很可能会导致很多问题 问题是: 以下是我的解决方案: 我确信还有另一种解决这个问题的方法,只是我真的想不出来谢谢您的帮助好的,让我们用itertools作弊:) 输出 True False False False True 这是一个名为3和的著名问题 此解决方案的时间复杂度为O(n^3),您可以实现O(n^2)的算法,该算法在下面的链接中用多种语言解

我想知道是否有其他方法可以解决这个问题,而不必像我在这里做的那样使用3个嵌套for循环?我知道,如果在足够大的列表上测试该方法,以这种方式嵌套循环很可能会导致很多问题

问题是:

以下是我的解决方案:


我确信还有另一种解决这个问题的方法,只是我真的想不出来
谢谢您的帮助

好的,让我们用itertools作弊:)

输出

True
False
False
False
True

这是一个名为3和的著名问题

此解决方案的时间复杂度为O(n^3),您可以实现O(n^2)的算法,该算法在下面的链接中用多种语言解释和实现:


如果您已经测试了(1,5,10),那么就没有必要测试以下任何一项:(1,10,5),(5,1,10),(5,10,1),(10,1,5)或(10,5,1)。如果前两个硬币的总和已经超过了金额,那么第三个硬币的任何检查都没有意义。我完全忘记了这种可能性。谢谢印刷品(可以用三枚硬币([1,1,5,10,25,37])付账吗?你的代码是真的。代码是错的。例如,输入
[20,20,20,50],60时失败。显然,可以用三枚硬币支付这笔金额,但函数返回
False
。像这样的贪婪算法不能用来解3SUM.oh,也不能解三个硬币。好的,我将删除答案:D绝对不正确。Sorry无法删除approved,所以我使用生成器对其进行了更新,它们在python中非常棒@(肯尼迪)您的解决方案的时间复杂度还不太好,如果答案为真,它是O(n^3),如果答案为假,它是O(n!),如果您将“len(denoms)”替换为3,您的时间复杂度将始终是O(n^3),这并不比@Flavio Esposito的解决方案好
for i in range(len(denoms)):
    one_coin = denoms[i]
    for j in range(len(denoms)):
        another_coin = denoms[j]
        for k in range(len(denoms)):
            last_coin = denoms[k]
            if one_coin + another_coin + last_coin == amount:
                return True
return False
import itertools
from typing import List


def can_pay_with_three_coins(denoms: List[int], amount: int) -> bool:
    """Return True if and only if it is possible to form amount, which is a
    number of cents, using exactly three coins, which can be of any of the
    denominations in denoms.

    >>> can_pay_with_three_coins([1, 5, 10, 25], 36)
    True
    >>> can_pay_with_three_coins([1, 5, 10, 25], 37)
    False

    """

    for variant in itertools.permutations(denoms, len(denoms)):
        if sum(variant[:3]) == amount:
            return True

    return False


print(can_pay_with_three_coins([1, 5, 10, 25], 36))
print(can_pay_with_three_coins([1, 5, 10, 25], 37))
print(can_pay_with_three_coins([1, 1, 5, 10, 25], 37))
print(can_pay_with_three_coins([1, 3, 5, 10, 25], 37))
print(can_pay_with_three_coins([20, 20, 20, 50], 60))
True
False
False
False
True