在列表中找到三个和的数量

时间:2019-01-17 03:44:27

标签: python python-3.x list hash

如果您有列表

numList = [1,2,3,4,5,6,7]

并要求您找到添加到特定数字的三个和的数量

target = 10

如何得出答案?

例如,以下各项的组合:[1,3,6], [1,2,7], [2,3,5], [1,4,5] 将导致返回值4

我知道如何使用基于哈希的函数通过以下代码得出解决方案的一个三和,但是不确定如何添加所有唯一的三和解决方案。

def find3Numbers(A,arr_size,sum): 
    for i in range(0,arr_size-1): 
        #Find pair in subarray A[i+1..n-1]  
        # with sum equal to sum - A[i] 
        s = set() 
        curr_sum = sum - A[i] 
        for j in range(i+1,arr_size): 
            if (curr_sum - A[j]) in s: 
                print("Triplet is", A[i],  
                        ", ", A[j], ", ", curr_sum-A[j]) 
                return True
            s.add(A[j]) 

    return False

2 个答案:

答案 0 :(得分:2)

使用itertools.combinations

from itertools import combinations

numList = [1,2,3,4,5,6,7]

def check(value):
    return sum(value) == 10

filtered = list(filter(check, list(combinations(numList, 3))))
print(filtered)
#[(1, 2, 7), (1, 3, 6), (1, 4, 5), (2, 3, 5)]

组合找到所有可能的组合,然后我将其过滤为仅加起来为10的组合。

答案 1 :(得分:1)

您只需要调整解决方案即可计算解决方案,而不是在找到第一个解决方案之后返回:

def find3Numbers(A,arr_size,sum):
    count_sums = 0

    for i in range(0,arr_size-1): 
        #Find pair in subarray A[i+1..n-1]  
        # with sum equal to sum - A[i] 
        s = set() 
        curr_sum = sum - A[i] 
        for j in range(i+1,arr_size): 
            if (curr_sum - A[j]) in s: 
                count_sums += 1 # Count here
            s.add(A[j]) 

    return count_sums # Finally return the count

请注意,这并不是说您的算法现在正确。接下来,您可能想对s使用计数集而不是常规集。参见collections.Counter