检查三元组数量的最佳方法,其中[k] <a [i] <a [j]为=“”all =“”i <j <k =“”in =“”an =“”array =“ “

时间:2015-05-16 20:21:02

标签: arrays algorithm

=”“

我正在解决一个问题,我必须找到AiAj的三元组数,和Ak,以及数组中的Ak < Ai < Aji < j < k

通过暴力解决这个问题是微不足道的,但复杂度为O(N ^ 3)。解决这个问题的最佳方法是什么?

1 个答案:

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