描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
import java.util.*;
public class Solution {
int count = 0;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 归并排序中的临时数组本来是放在merge方法中,可以将其放在InversePairs方法中,减少临时变量消耗的时间和空间
* @param nums int整型一维数组
* @return int整型
*/
public int InversePairs (int[] nums) {
if(nums != null && nums.length != 0 ){
int[] temp = new int[nums.length];
mergeSort(nums,0,nums.length-1,temp);
return count;
}else{
return 0;
}
}
public void mergeSort(int[] nums,int start,int end,int[] temp){
if(start >= end){
return;
}
int mid = (start+end) >> 1;
mergeSort(nums,start,mid,temp);
mergeSort(nums,mid+1,end,temp);
merge(nums,start,mid,end,temp);
}
public void merge(int[] nums,int start,int mid,int end,int[] temp){
int Index = start;
int start2 = mid+1;
int i = start;
while(start <= mid && start2 <= end){
if(nums[start] > nums[start2]){
temp[Index++] = nums[start2++];
count = (count + mid - start +1) % 1000000007;
} else{
temp[Index++] = nums[start++];
}
}
while(start <= mid){
temp[Index++] = nums[start++];
}
while(start2 <= end){
temp[Index++] = nums[start2++];
}
for(int k = i;k <=end;k++){
nums[k] = temp[k];
}
}
}