簡體   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