📌  相关文章
📜  使得i <j <k且a [k] <a [i] <a [j]的数组(i,j,k)中的三元组的计数(1)

📅  最后修改于: 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
参考资料