Google Foobar:次优解决方案中的逻辑错误

时间:2020-03-01 16:09:59

标签: python algorithm logic

问题

写一个函数答案(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个。

我的代码

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

我的问题

我已经查看了有关此问题的一些stackoverflow答案。我知道如何以不同且更优化的方式进行操作。唯一的问题是,我上面的代码仅通过5个给定测试用例中的2个测试用例。我想了解我在以上代码中做错的事情。我对找出错误而不是更好地解决错误更感兴趣。

如果您认为代码不正确,那么由于解决方案的速度很慢,是否会使测试用例失败?

任何帮助将不胜感激。

2 个答案:

答案 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)