题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
思路
1 利用归并排序的思想,把数据分成前后两个数组。
2 然后递归分到每个数组仅有一个数据项,再合并数组。
3 在合并的时候,出现前面的数组值array[i]大于后面数组值array[j]时;则前面数array[i]~array[mid]都是大于array[j]的,因此count += mid - i。
import java.util.*;
public class Solution {
public int InversePairs(int [] array) {
int count=0;
int [] copy=new int[array.length];
return count=InversePairs(array,copy,0,array.length-1);
}
public int InversePairs(int []array,int []copy,int low,int high)
{
if(low==high) return 0;
int mid=(low+high)/2;
int leftCount=InversePairs(array,copy,low,mid)%1000000007;
int rightCount=InversePairs(array,copy,mid+1,high)%1000000007;
int i=mid;
int j=high;
int Copy_Postition=high;//记录copy数组的最后一个下标,然后每次array[i]>array[j],都把最大的数放在copy数组。
int count=0;
while(i>=low&&j>mid)
{
if(array[i]>array[j]){
count+=j-mid;
copy[Copy_Postition--]=array[i--];
if(count>=1000000007)
count%=1000000007;
}
else
copy[Copy_Postition--]=array[j--];
}
//把剩下还没遍历完的array的元素,放到copy数组
while(i>=low)
copy[Copy_Postition--]=array[i--];
while(j>mid)
copy[Copy_Postition--]=array[j--];
for(int left=low;left<=high;left++)
array[left]=copy[left];
return (leftCount+rightCount+count)%1000000007;
}
}
其他的题题解
剑指offer题解 java版