1.题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
传送门
2.code(java1.7版本)
public class Solution {
public long ans=0;
public int InversePairs(int [] array) {
if(array==null)return 0;
int len=array.length;
if(len==0)return 0;
help(0,len-1,array);
return (int)(ans%1000000007);
}
public void help(int left,int right,int[]array){
if(left==right)return;
int mid=left+(right-left)/2;
help(left,mid,array);
help(mid+1,right,array);
int len=right-left+1;
int[]temp=new int[len];
int i=left;
int j=mid+1;
int k=0;
while(i<=mid||j<=right){
if(i>mid){
temp[k]=array[j];
j++;
k++;
}
else if(j>right){
temp[k]=array[i];
i++;
k++;
}
else{
if(array[i]>array[j]){
ans=ans+mid-i+1;
temp[k]=array[j];
j++;
k++;
}
else{
temp[k]=array[i];
i++;
k++;
}
}
}
k=0;
for(i=left;i<=right;i++){
array[i]=temp[k];
k++;
}
}
}
3.结题思路
我做的就是运用的归并排序的思想,就是对于归并排序的一个改进,把数据分成前后两个数组(递归分到每个数组仅有一个数据项),合并数组,合并时,出现前面的数组值array[i]大于后面数组值array[j]时;则前面数组array[i]~array[mid]都是大于array[j]的,ans+= mid+1 - i。这样归并完整个数组,也就完成了整个逆序对的计算。(打完收工)