我正在解决一个问题,我必须找到Ai
,Aj
的三元组数,和Ak
,以及数组中的Ak < Ai < Aj
和i < j < k
。
通过暴力解决这个问题是微不足道的,但复杂度为O(N ^ 3)。解决这个问题的最佳方法是什么?
答案 0 :(得分:2)
这是一种O(n ^ 2)方法,它以相反的顺序修复i并迭代数组的其余部分,跟踪a [i]下面的元素数。
def count_triplets(a):
"""Count the number of triplets a[k]<a[i]<a[j] for i<j<k"""
t = 0
for i,ai in enumerate(a):
kcount = 0 # The number of elements smaller than a[i]
for x in a[:i:-1]:
if x<ai:
kcount += 1
elif x>ai:
t += kcount
return t
A=[1,6,3,4,7,4]
print count_triplets(A)
对于给定的数组数组,有趣的情况是当i等于1且ai等于6时。
该程序现在在数组中的其余条目上向后工作,如下所示:
x = 4
x < ai so kcount increased to 1
x = 7
x > ai so t increased by kcount, i.e. t increased to 1
x = 4
x < ai so kcount increased to 2
x = 3
x < ai so kcount increased to 3
我的所有其他值根本不会增加t,因此t的最终值为1.
Hackerrank网站希望代码支持大量输入。下面的代码通过了所有测试。
N=input()
for n in range(N):
A=map(int,raw_input().split())
print count_triplets(A)