我想使用'枚举'来解决以下任务在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)。
答案 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