题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入
1,2,3,4,5,6,7,0
输出
7
解法
归并排序,注意是从大到小的顺序排列,每一次大的元素归并时,算上对面数组中剩下的个数,由此叠加出本层的总数,然后将各层数的个数叠加,得出最终总数。
P.S:在牛客网做题要注意空间的问题,复制数组不要全复制,局部复制即可,不然会超过时间限制(赋值次数变多)
public class Solution {
public int InversePairs(int [] array) {
if(array == null||array.length==0){
return 0;
}
int[] copy = new int[array.length];
int result = mergeSort(array,copy,0,array.length - 1);
return result;
}
public int mergeSort(int [] array,int [] copy,int s,int e){
if(s == e){
return 0;
}
int mid = (s + e)>>1;
int left_count = mergeSort(array,copy,s,mid)%1000000007;;
int right_count = mergeSort(array,copy,mid + 1,e)%1000000007;;
int count = 0;
for(int i = s;i <= e;i++){//空间
copy[i] = array[i];
}
int i = s;
int j = mid + 1;
int k = s;
while(i <= mid && j <= e){
if(copy[i] > copy[j]){
array[k] = copy[i];
count += e + 1 - j;
if (count >= 1000000007) {
count = count % 1000000007;
}
i++;
k++;
}
else{
array[k] = copy[j];
j++;
k++;
}
}
if(i > mid){
while(k <= e){
array[k] = copy[j];
k++;
j++;
}
}
else{
while(k <= e){
array[k] = copy[i];
k++;
i++;
}
}
return (count + left_count + right_count)%1000000007;
}
}