注意,不要有重复的组合。
例如1:
nums = [-1,0,1,2,-1,-4]
输出 [[-1,-1,2],[-1,0,1]]
例如2:
nums = [0]
输出 []
nums = [-1,0,1,2,-1,-4]
res=[]
for i in range(len(nums)):
for j in range(len(nums)):
for k in range(len(nums)):
if i != j and i != k and j != k and nums[i] + nums[j] + nums[k] == 0:
a=sorted([nums[i], nums[j], nums[k]])
if a not in res:
# res.append([nums[i], nums[j], nums[k]])
res.append(a)
print(res)
给个例子参考:
def func_3s(nums):
lst = []
for i in range(len(nums)):
for j in range(len(nums)):
if j==i:
continue
for k in range(len(nums)):
if j==k or k==i:
continue
if nums[i]+nums[j]+nums[k]==0:
l = [nums[i],nums[j],nums[k]]
l.sort()
if l not in lst:
lst.append(l)
return lst
nums = [-1,0,1,2,-1,-4]
print(func_3s(nums))
nums = [0]
print(func_3s(nums))
import itertools as it
def func_3s(nums):
res = set(tuple(sorted(i)) for i in it.combinations(nums, 3) if sum(i) == 0)
return [list(i) for i in res]
s = [-1, 0, 1, 2, -1, -4]
rs = func_3s(s)
print(rs)
'''--result
[[-1, 0, 1], [-1, -1, 2]]
'''
#阶乘
def fact(n):
f=1
for i in range(1,n+1):
f *= i
print(f)
'''
第一个问题,条件1:这三个数要么都不同,要么有两个相同,条件2和为0,
三个相同的数字相加等于0,除非是3个0,所以第二个条件满足的条件下,除了0这个特殊情况
完全满足第一个条件,所以第一个条件我们完全不必理会只要排除全是0的情况。
'''
def func_3s(li):
res = []
for i in range(len(li)-1):
for k in range(i+1,len(li)):
x = -(li[i]+li[k])
temp = sorted([li[i],li[k],x])
if x in li and any(temp):
if temp not in res:
res.append(temp)
else:
break
print(res)
li = [-1,0,1,2,-1,-4,0,0,3,-2,0,-5,1]
func_3s(li)
这道题用数学语言来描述就是,有一个数的集合,从中取3个数使得和为0的组合情况。
所以这个解实质是从列表中取3个数(索引均不相同)),满足和为0的情况,变成了一个提取组合加过滤的算法。
不过你所谓的不能有重复的组合是指什么?
def func_3s(inList):
rt=[]
inLen = len(inList)
if inLen<3:
return rt
for i in range(inLen):
for j in range(i+1,inLen):
for k in range(j+1,inLen):
if inList[i]+inList[j]+inList[k] == 0:
# 下面的几步是根据重复定义来看,如果重复指i,j,k 位置,则应该去掉下面3行,直接变为 rt.append([inList[i],inList[j],inList[k]])
atmp=sorted([inList[i],inList[j],inList[k]])
if atmp not in rt:
rt.append(atmp)
return rt
li = [-1,0,1,2,-1,-4,0,0,3,-2,0,-5,1]
print( func_3s(li) )