两种写法都能过,
简单方法就是,复制一份数组并排序,然后遍历这个有序的数组,比如第一个最小值为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); } }