两种写法都能过,
简单方法就是,复制一份数组并排序,然后遍历这个有序的数组,比如第一个最小值为0,在原数组中查看0的索引,就可以得到关于0的逆序对;之后将0从原数组移除,继续遍历。
归并排序,不重复大牛的说法了,坐到0bug,一遍过就行。
import java.util.*;
public class Solution {
int res = 0;
public int InversePairs(int [] array) {
// int[] sort = new int[array.length];
// System.arraycopy(array, 0, sort,0 ,array.length);
// Arrays.sort(sort);
// int res = 0;
// ArrayList<Integer> arrayList = new ArrayList<Integer>();
// for (int i : array) {
// arrayList.add(i);
// }
// for(int i =0;i<sort.length;i++){
// int index = arrayList.indexOf(sort[i]);
// res += index;
// res = res%1000000007;
// arrayList.remove(index);
// }
// return res%1000000007;
sort(array,0,array.length-1);
return res;
}
public void sort(int [] array, int l, int r) {
if(array.length == 0 || l == r){
return;
}
int mid = l + (r-l)/2;
sort(array, l, mid);
sort(array, mid+1, r);
merge(array, l, mid, r);
}
public void merge(int [] array,int l, int mid, int r) {
int i = l;
int j =mid+1;
int t =0;
int[] temp = new int[r-l+1];
while(i<=mid && j<= r){
if(array[i] <= array[j]){
temp[t++] = array[i++];
}else{
res += (mid-i+1);
res = res% 1000000007;
temp[t++] = array[j++];
}
}
while(i<=mid){
temp[t++] = array[i++];
}
while(j<=r){
temp[t++] = array[j++];
}
System.arraycopy(temp,0, array,l, temp.length);
}
}


京公网安备 11010502036488号