- class Solution {
- public int reversePairs(int[] record) {
- if(record==null || record.length<2){
- return 0;
- }
- return process(record,0,record.length-1);
- }
- public static int process(int[] arr,int L, int R){
- if(L==R) return 0;
- int mid = L + ((R-L)>>1);
- return process(arr,L,mid)//左边排序产生的逆序对
- +process(arr,mid+1,R)//右边排序产生的逆序对
- +merge(arr,L,mid,R);//合起来产生的逆序对
- }
- //从大到小排,因为要找右边 比 当前数小的
- public static int merge(int[] arr,int L,int mid,int R){
- int res = 0;
- int[] help = new int[R-L+1];
- int i = 0;//help数组的指针
- int p1 = L;//左边
- int p2 = mid+1;//右边
- while(p1<=mid && p2<=R){
- res += arr[p1]>arr[p2] ? (R-p2+1) : 0;
- help[i++] = arr[p1]>arr[p2] ? arr[p1++] : arr[p2++];//当相等时,先拷贝右边的,不然不知道右边有多少个大于p1指向的值
- }
- //有一个排完时
- while(p1<=mid){
- help[i++] = arr[p1++];
- }
- while(p2<=R){
- help[i++] = arr[p2++];
- }
- for(i=0;i
- arr[L+i] = help[i];
- }
- return res;
- }
- }