问题
写一个函数答案(l),该函数采用一个正整数l的列表并计算(lst [i],lst [j],lst [k])的“幸运三元组”的数量,其中i 幸运三元组基本上是元组(x,y,z),其中x除以y,y除以z。例如(1,2,4)。 例如,[1、2、3、4、5、6]具有三元组:[1、2、4],[1、2、6],[1、3、6],得出答案总共3个。 我的代码 我的问题 我已经查看了有关此问题的一些stackoverflow答案。我知道如何以不同且更优化的方式进行操作。唯一的问题是,我上面的代码仅通过5个给定测试用例中的2个测试用例。我想了解我在以上代码中做错的事情。我对找出错误而不是更好地解决错误更感兴趣。 如果您认为代码不正确,那么由于解决方案的速度很慢,是否会使测试用例失败? 任何帮助将不胜感激。def isLuckyTriple(a,b,c):
if b%a==0 and c%b==0:
return True
return False
def solution(l):
count=0
l=sorted(l)
for i in range(len(l)-2):
for j in range(i+1,len(l)-1):
for k in range(j+1,len(l)):
if isLuckyTriple(l[i],l[j],l[k]):
count+=1
return count
答案 0 :(得分:2)
删除l=sorted(l)
步骤是因为约束之一说i < j < k
,因为它更改了数字索引的顺序。
请考虑以下情况:
4 2 1
答案应为0
,但您的代码将返回1
。
关于效率,您可以计算每个数字从右边划分的数量。对于1,2,3,4,5,6
,每个项目的计数如下:
1 2 3 4 5 6
5 2 1 0 0 0
对于1
,当您来到2
时,2
在缓存数组中已经有2
,因此现在您有2个三元组可添加到最终答案中。来到1
时,您得到3
三元组,因此2+1
= 3
。
时间复杂度: O(n ^ 2)
空间复杂度: O(n)
既然如此,这个问题就说The elements of l are between 1 and 999999 inclusive
,我想您可以采用阶乘方式。
首先收集地图中的所有值计数。
现在,对每个数字进行倍数转换,并从最后到第三个添加三元组。如下所示:
triplet_map = {}
map = {}
for every number in array: # from last to first
if number in triplet_map:
triplets += triplet_map(number)
continue
cnt = 0
for(i = number; i < 1000000; i *= number)
if i in map:
if map(i) > 0:
cnt += map(i)
map(number,map(number) + 1)
triplets += cnt
triplet_map(number,cnt)
这样,就像每个数字的对数时间一样。没有做太多的测试,但似乎可以正常工作。
答案 1 :(得分:1)
def answer(l):
triples_count=0
p=len(l)
print l
for i in xrange(p-2):
for j in xrange(i+1, p-1):
if l[j] % l[i] == 0:
for k in xrange(j+1, p):
if l[k] % l[j] == 0:
#print l[i], l[j], l[k]
triples_count=triples_count+1
return(triples_count)