ac_788逆序对的数量
题目描述
题目大意&链接
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。(逆序对:i < j 但 q[i] > q[j],<i, j> 构成一个逆序对)
输入输出样例:
输入:
6
2 3 4 5 6 1
输出:
5
详情:ac_788逆序对的数量
解题思路
利用到归并排序的分治思想,递归排序的自顶向下过程中,统计3种情况的逆序对数量。
- 统计红色区间的逆序对数量:
LL res = merge_sort(l, mid) + merge_sort(mid + 1, r);
- 统计蓝色区间的逆序对数量:
LL res = merge_sort(l, mid) + merge_sort(mid + 1, r);
- 统计mid两边的逆序对数量:
//归并过程并计数逆序对
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;
}
}
完整代码
|
时间和空间复杂度
时间复杂度:O(nlogn)
空间复杂度:O(n) 开辟了长度为n的temp数组
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ZW_Blog!