如果两个区间为[4, 3] 和[1, 2]
那么逆序数为(4,1),(4,2),(3,1),(3,2),同样的如果区间变为有序,比如[3,4] 和 [1,2]的结果是一样的,也就是说区间有序和无序结果是一样的。
但是如果区间有序会有什么好处吗?当然,如果区间有序,比如[3,4] 和 [1,2]
如果3 > 1, 显然3后面的所有数都是大于1, 这里为 4 > 1, 明白其中的奥秘了吧。所以我们可以在合并的时候利用这个规则。
public int count = 0;
public int InversePairs(int [] array) {
mergeSort(array,0,array.length);
return count;
}
private void mergeSort(int[] array, int left, int right) {
if (right-left<=1) {
return;
}
int mid = (left+right)/2;
mergeSort(array,left,mid);
mergeSort(array,mid,right);
merge(array,mid,left,right);
}
private void merge(int[] array, int mid, int left, int right) {
int cur1 = left;
int cur2 = mid;
int[] output = new int[right-left];
int outputIndex = 0;
while (cur1<mid &&cur2<right) {
if (array[cur1]>=array[cur2]) {
count =(count+ mid-cur1)%1000000007;
output[outputIndex] = array[cur2];
cur2++;
outputIndex++;
}else {
output[outputIndex] = array[cur1];
cur1++;
outputIndex++;
}
}
while (cur1<mid) {
output[outputIndex] = array[cur1];
cur1++;
outputIndex++;
}
while (cur2<right) {
output[outputIndex] = array[cur2];
cur2++;
outputIndex++;
}
for (int i = 0;i<right-left;i++) {
array[left+i] = output[i];
}
}