Python 锯齿形四足动物

Python 锯齿形四足动物,python,algorithm,permutation,Python,Algorithm,Permutation,我看到了这个有趣的问题,想知道是否有更多的方法来解决它: 给定从1到n的数字排列,计算 四倍索引(i,j,k,l),这样i你需要的是某种二维树,它允许你快速回答“k之后有多少点的值大于A[j],”和“j之前有多少点的值小于A[k]?”这两个问题通常是时间O(n log(n))生成,这些查询应该及时运行,比如O(log(n)^2)) 存在许多这样的数据结构。其中一个选项是一个应用程序上的变体。将每个阵列元素转换为一个点,其中x坐标表示阵列中的位置,y坐标表示其值。您的查询只是计算一个框中有多少个元

我看到了这个有趣的问题,想知道是否有更多的方法来解决它:

给定从1到n的数字排列,计算
四倍索引(i,j,k,l),这样i你需要的是某种二维树,它允许你快速回答“k
之后有多少点的值大于A[j]
,”和“j之前有多少点的值小于A[k]?”这两个问题通常是时间
O(n log(n))
生成,这些查询应该及时运行,比如
O(log(n)^2))

存在许多这样的数据结构。其中一个选项是一个应用程序上的变体。将每个阵列元素转换为一个点,其中x坐标表示阵列中的位置,y坐标表示其值。您的查询只是计算一个框中有多少个元素

现在你可以在所有的
j,k
上做一个双循环,并计算出有多少个锯齿形的四倍体作为内对

def get_smaller_before(A):
    smaller_before  = [0] * len(A)
    for i in range(len(A)):
        for j in range(i):
            if A[j] < A[i]:
                smaller_before[i] += 1
    return smaller_before

def get_larger_after(A):
    larger_after = [0] * len(A)
    for i in range(len(A)):
        for j in range(i+1, len(A)):
            if A[i] < A[j]:
                larger_after[i] += 1
    return larger_after

def countQuadrples(nums):
    if not nums:
        return False
    smaller_before      = get_smaller_before(nums)
    larger_after        = get_larger_after(nums)
    counter             = 0
    stack = []
    for j in reversed(range(1, len(nums))):
        # i < j < k < l
        # smaller_before < nums[k] < nums[j] < larger_after
        while stack and nums[stack[-1]] < nums[j]:
            counter += smaller_before[j] * larger_after[stack[-1]]
            stack.pop()
        stack.append(j)
    return counter