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算法习题课(一)

浙公网安备 33010602011771号