【问题标题】:Find the number of three sums in a list查找列表中三个和的数量
【发布时间】:2019-06-11 05:27:50
【问题描述】:

如果给你一个列表

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

【问题讨论】:

  • 看起来像是一个家庭作业问题,但这里想到了itertools.combinations...
  • 注意:使用隐藏python内置类型或函数的变量或参数名称是一个坏主意(例如,一个名为sum的参数)。

标签: python python-3.x list hash


【解决方案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

【讨论】:

    【解决方案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 的组合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多