题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入:
1,2,3,4,5,6,7,0
输出:
7
解法一:找不到工作的笨逼解法
思路: 我只会这个
//毫无疑问超时过不去
public class Solution {
public int InversePairs(int [] array) {
int len = array.length;
int count = 0;
for(int i=0;i<len-1;i++){
for(int j = i+1;j<len;j++){
if(array[i]>array[j]) count++;
}
}
return count%1000000007;
}
}
解法二:归并排序思想
import java.util.*;
public class Solution {
public int InversePairs(int [] array) {
if(array==null||array.length==0) return 0;
int[] copy = new int[array.length];
return InverseDeal(array,copy,0,array.length-1);
}
private int InverseDeal(int[] array,int[] copy,int low,int high){
if(low>=high) return 0;//递归出口
int mid = low+((high-low)>>1);
int countleft = InverseDeal(array,copy,low,mid)%1000000007;
int countright = InverseDeal(array,copy,mid+1,high)%1000000007;
int i = mid;
int j = high;
int tmp = high;
int count = 0;
while(i>=low&&j>mid){
if(array[i]>array[j]){
count += j-mid;
copy[tmp--] = array[i--];
if(count>=1000000007){ //必须要加防止越界
count%=1000000007;
}
}else{
copy[tmp--] = array[j--];
}
}
while(i>=low){
copy[tmp--] = array[i--];
}
while(j>mid){
copy[tmp--] = array[j--];
}
for(i=low;i<=high;i++){
array[i] = copy[i];
}
return (count+countleft+countright)%1000000007;
}
}