Python 锯齿形四足动物
我看到了这个有趣的问题,想知道是否有更多的方法来解决它: 给定从1到n的数字排列,计算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坐标表示其值。您的查询只是计算一个框中有多少个元
四倍索引(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