【题目描述】
给定一个序列a1,a2,…,an𝑎1,𝑎2,…,𝑎𝑛,如果存在i<j𝑖<𝑗并且ai>aj𝑎𝑖>𝑎𝑗,那么我们称之为逆序对,求逆序对的数目。
【输入】
第一行为n𝑛,表示序列长度,接下来的n𝑛行,第i+1𝑖+1行表示序列中的第i𝑖个数。
【输出】
所有逆序对总数。
【输入样例】
4
3
2
3
2
【输出样例】
3
【提示】
N≤10^5,Ai≤10^5𝑁≤10^5,𝐴𝑖≤10^5。
【解题思路】 可以用归并排序的思想来解决这道题。归并排序是一种分治算法,它将数组分成两个子数组,分别进行排序,然后将两个子数组合并成一个有序数组。在合并的过程中,如果左边的子数组的当前元素比右边的子数组的当前元素大,那么说明左边的子数组中的当前元素及其后面的元素和右边的子数组的当前元素构成逆序对。因此,在合并的过程中,我们每次都计算出逆序对的数目。
【伪代码】
- 定义一个全局变量count,表示逆序对的数目,初始值为0
- 定义一个辅助数组temp,用来存储合并过程中的临时结果
- 定义一个递归函数mergeSort,函数接受数组nums和数组的范围[left, right]作为参数
- 如果left == right,表示数组只有一个元素,不需要排序,直接返回
- 计算中间位置mid = (left + right) / 2
- 递归调用mergeSort函数对数组的前半部分排序,即mergeSort(nums, left, mid)
- 递归调用mergeSort函数对数组的后半部分排序,即mergeSort(nums, mid + 1, right)
- 将数组的前半部分和后半部分合并到temp数组中,合并的过程中计算逆序对的数目
- 将temp数组的结果赋值给原数组nums的相应位置
- 调用mergeSort函数,传入数组和数组的范围[0, n-1]
- 输出逆序对的数目count