数组中的逆序对
题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
0 < = 数 组 长 度 < = 50000 0 <= 数组长度 <= 50000 0<=数组长度<=50000
思路 归并排序
(1)count_reverse用来递归统计数组的左子数组、右子数组以及左右合并后的逆序对数
(2)merge函数类似于归并排序,统计左右两边合在一起时有多少逆序对
- 设置两个下标计数i、j分别从左右子数组的头部开始,k为存放临时数字的数组下标,也从0开始
- 如果左<=右,则左++并将遍历过的数字加入k中
- 如果左>右,此时左指针后面所有都大于右,逆序对数等于左边剩下的元素个数
- 一遍走完后,把另一边剩下的也加入临时数组,此时临时数组已按从小打到排好序
- 最后将临时数组复制回原数组。
以空间换时间,空间复杂度 O ( n ) O(n) O(n),时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
**C++ **
class Solution {
public:
int reversePairs(vector<int>& nums) {