1.本题知识点
归并排序
2. 题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P00000007
3. 思路
① 归并排序,不会的请跳到我的基础算法博客查看。
② 归并过程中,排序的同时记录逆序对的个数。
Java版本:
public int SplitAndMerge(int [] array
, int left
, int right
, int [] temp
) {
if(array
== null
|| array
.length
== 0 ) return 0;
if(left
< right
){
int mid
= (left
+ right
) >> 1;
int leftCount
= SplitAndMerge(array
, left
, mid
, temp
)%1000000007;
int rightCount
= SplitAndMerge(array
, mid
+1, right
, temp
)%1000000007;
int count
= 0;
int i
= left
;
int j
= mid
+1;
int t
= 0 ;
while(i
<= mid
&& j
<= right
){
if(array
[i
] <= array
[j
]){
temp
[t
++] = array
[i
++];
}
else{
temp
[t
++] = array
[j
++];
count
+= mid
- i
+1 ;
if(count
>= 1000000007){
count
= count
% 1000000007;
}
}
}
while(i
<= mid
){
temp
[t
++] = array
[i
++];
}
while(j
<= right
){
temp
[t
++] = array
[j
++];
}
t
=0;
while(left
<= right
){
array
[left
++] = temp
[t
++];
}
return (leftCount
+ rightCount
+ count
)%1000000007;
}
return 0;
}
public int InversePairs(int [] array
) {
return SplitAndMerge(array
, 0, array
.length
-1, new int[array
.length
]);
}
转载请注明原文地址: https://yun.8miu.com/read-111397.html