在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
思路:相当于用归并排序,把数组拆分成两个两个,然后对比,前面的数大于后面的数就是逆序对,所以逆序对加一,最后得到的是排序过后的数组。
public class Solution {
private long cnt=0;
private int[] tmp;
public int InversePairs(int [] array) {
tmp=new int[array.length];
mergeSort(array,0,array.length-1);
return (int)(cnt%1000000007);
}
private void mergeSort(int[] nums,int l,int h){
if(h-l<1){
return;
}
int m=(l+h)/2;
mergeSort(nums,l,m);
mergeSort(nums,m+1,h);
merge(nums,l,m,h);
}
private void merge(int[] nums,int l,int m,int h){
int i=l,j=m+1,k=l;
while(i<=m||j<=h){
if(i>m){
tmp[k]=nums[j++];
}else if(j>h){
tmp[k]=nums[i++];
}else if(nums[i]<=nums[j]){
tmp[k]=nums[i++];
}else{
tmp[k]=nums[j++];
this.cnt+=m-i+1;
}
k++;
}
for(k=l;k<=h;k++){
nums[k]=tmp[k];
}
}
}
错误:在h-l<1时返回,打错了l和1