3Sum使用python3和enumarate

时间:2018-06-09 03:42:24

标签: python-3.x

我想使用'枚举'来解决以下任务在python3中

枚举工作方式如下所示

nums=(2,7,1,15)               # a tuple  

for num in enumerate(nums):
        print(num, 'hello')   

#output
#(0, 2) hello        #enumarate(nums) = (0,2)
#(1, 7) hello
#(2, 1) hello
#(3, 15) hello      


for count, num in enumerate(nums):
        print(num, 'hello')      

# Output
#2 hello    here count=0 but not displayed 
#7 hello    here count=1 but not displayed
#1 hello    here count=2 but not displayed
#15 hello   here count=3 but not displayed

使用上述原理,给定n个整数的数组nums,nums中是否有元素a,b,c,a + b + c =目标和?找到数组中所有唯一的三元组,它们给出sum =目标总和。

目标总和= 10的解决方案是:

[
  [0,1,2]             
]

其中num为第0个索引+ num为第1个索引+ num为第2个索引(7 + 2 + 1 = 10)。

2 个答案:

答案 0 :(得分:2)

您对算法有什么想法来解决问题吗?

我可能会做一些事情,比如建立两个dict列出使用数组索引的所有方法,将1个数字和2个数字相加作为某个键值。

例如,如果我被赋予nums = [2, 7, 1, 2, 3],我会编写代码来构建如下表:

one_sum = {1: [2], 
           2: [0, 3], 
           3: [4],
           7: [1]}

我会使用集合模块中的defaultdict来有效地编写此代码(在上面初始化为one_sum = defaultdict(list),尽管set也是该问题的有效数据结构。“ / p>

在这部分中使用enumerate会很简单;例如,

for i, n in enumerate(nums):
    one_sum[n].append(i)

然后我会建立一个two_sum表,这次显示所有成对的索引。继续上面的例子,我想生成:

two_sum = {3: [(0, 2), (2, 3)],
           4: [(2, 4)],
           5: [(0, 4), (3, 4)],
           8: [(1, 2)],
           9: [(0, 1), (1, 3)],
          10: [(1, 4)]}

(请注意,有效执行此操作的一种方法是循环构建one_sum,但请注意不要重复使用索引,例如,不要添加(2,2)或{{ 1}}到(4,4)因为虽然two_sum[4]确实加起来为4,但它使用了两次索引(因此并不是唯一的。)另外要注意不要双重添加乱序的索引。)

最后,我将遍历nums[2] + nums[2] dict,查看总和为one_sum的索引,然后查看k以查看是否有任何索引对总计为{{ 1}},如果是这样,那么在找到解决方案的同时将这些对连接起来(检查排序索引而不是重复元组中的索引)。

对于10的目标,这将理想地构建

two_sum

答案 1 :(得分:0)

这是一种蛮力方法。注意,它不如此算法有效。

def f(nums, target):
    sols = []
    for i1, n1 in enumerate(nums):
        for i2, n2 in enumerate(nums[i1+1:]):
            for i3, n3 in enumerate(nums[i2+1:]):
                if (n1 + n2 + n3 == target):
                    sols.append([i1, i2, i3])
    return sols