3 回答

TA贡献1895条经验 获得超3个赞
每个问题都有时间限制,我认为大约是15秒。据我所知,所有测试用例在验证时并行运行,如果超过15秒,测试用例将失败。具有O(n^3)时间复杂度肯定会使测试用例失败。

TA贡献1807条经验 获得超9个赞
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)

TA贡献1827条经验 获得超9个赞
删除步骤,因为它会更改数字索引的顺序,因为其中一个约束说 。l=sorted(l)i < j < k
考虑以下情况:
4 2 1
答案应该是,但您的代码将返回。01
关于效率,您可以计算每个数字从右侧除以多少个数字。对于每个计数,如下所示:1,2,3,4,5,6
1 2 3 4 5 6
5 2 1 0 0 0
对于 ,当你来到 时,已经在缓存的数组中,所以现在你有2个三元组添加到最终答案中。当你来到时,你会得到三胞胎,所以=。1222132+13
时间复杂度: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)
这样,它就像每个数字的对数时间。没有测试这么多,但似乎有效。
添加回答
举报