📅  最后修改于: 2023-12-03 15:06:44.439000             🧑  作者: Mango
给定一个数组a,计算有多少个三元组 (i, j, k),其中 0 ≤ i < j < k < n 且 a[k] < a[i] < a[j]。
类似于逆序对的计算,我们可以使用归并排序的思路,在归并的时候计算逆序对的个数。但是在计算三元组的时候需要注意一个条件 i < j < k,所以在归并的时候需要计算在左半部分的数 a[left...mid] 中有多少个数 a[i] 满足 i < j,以及在右半部分中的数 a[mid+1...right] 中有多少个数 a[k] 满足 j < k,然后将两个部分的结果相乘,得到满足条件的三元组的个数。
def countTriplets(arr: List[int]) -> int:
return mergeSort(arr, 0, len(arr)-1)
def mergeSort(arr, left, right):
if left >= right:
return 0
mid = (left + right) // 2
cnt = mergeSort(arr, left, mid) + mergeSort(arr, mid+1, right)
i, j = left, mid+1
while i <= mid and j <= right:
if arr[i] < arr[j]:
j += 1
else:
k = j
while k <= right and arr[k] < arr[i]:
k += 1
cnt += (k - j) * (mid - i + 1)
i += 1
arr[left:right+1] = sorted(arr[left:right+1])
return cnt