LCR 170. 交易逆序对的总数 (归并排序)

在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。

示例 1:

输入:record = [9, 7, 5, 4, 6]
输出:8
解释:交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。

提示:

0 <= record.length <= 50000


typedef long long LL;

#define N  100010

int *q,tmp[N];

LL merge_sort(int l,int r){

    if(l>=r) return 0; // 递归出口
    int mid = (l+r) >> 1;
    LL res = merge_sort(l, mid) + merge_sort(mid+1, r); // 上轮递归的逆序对数量

    // 归并过程
    int k=0,i =l,j=mid +1;
    // 从左右半区优选小的归并到临时数组
    while (i<=mid && j<=r) {
        // 归并左半区数
        if(q[i]<=q[j]) tmp[k++] = q[i++];
        // 归并右半区
        else{
            tmp[k++] = q[j++];
            // ***** 每次归并右半区的数时,左半区剩下的数与当前右数构成逆序关系,统计 *****
            res += mid-i+1;
        }
    }
    // 一个数组归并完成,对另一数组扫尾
    while(i<=mid) tmp[k++] = q[i++];
    while (j<=r) tmp[k++] = q[j++];

    // 还原到原数组
    for(int i=l,j=0;i<=r;i++,j++){
        q[i] = tmp[j];
    }

    return res;
}

int reversePairs(int* record, int recordSize) {
    q=record;
    return merge_sort(0,recordSize-1);
}

Acwing算法习题课(一)

posted @ 2025-03-23 13:09  丘狸尾  阅读(21)  评论(0)    收藏  举报