题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
限制:
0 <= 数组长度 <= 50000
合并阶段 本质上是 合并两个排序数组 的过程,而每当遇到 左子数组当前元素 > 右子数组当前元素 时,
意味着 「左子数组当前元素 至 末尾元素」 与 「右子数组当前元素」 构成了若干 「逆序对」 。
因此,考虑在归并排序的合并阶段统计「逆序对」数量,完成归并排序时,也随之完成所有逆序对的统计。
lass Solution{ int[] nums,tmp; public int reversePairs(int nums[]){ this.nums=nums; tmp=new int[nums.length]; return mergeSort(0,nums.length-1); } public int mergeSort(int l,int r){ if(l>=r) return 0;//终止条件 int m = (l+r)/2; int res = mergeSort(l,m)+mergeSort(m+1,r);//递归划分 int i=l,j=m+1; for(int k=l;k<=r;k++){ //暂存数组 nums 闭区间 [i, r]内的元素至辅助数组 tmp tmp[k] = nums[k]; } for(int k=l;k<=r;k++){//循环合并 if(i==m+1){ nums[k]=tmp[j++]; }else if(j==r+1||tmp[i]<=tmp[j]){ nums[k]=tmp[i++]; }else { nums[k]=tmp[j++]; res+=m-i+1; } } return res;// 返回直至目前的逆序对总数 res } }