题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
代码实现
c++版
class Solution {
public:
int allSum(vector<int> arr,int L,int mid,int R){
int *help = new int(R-L+1);
int i = 0 ;
int pFirst = L;
int pSecond = mid + 1;
int sum = 0;
while (pFirst <=mid && pSecond <=R) {
sum += arr[pFirst] > arr[pSecond] ? (mid - pFirst+1):0;
help[i++] = arr[pFirst] < arr[pSecond] ? arr[pFirst++]:arr[pSecond++];
}
while (pFirst <= mid ) {
help[i++] = arr[pFirst++];
}
while (pSecond <= R) {
help[i++] = arr[pSecond++];
}
for (int k = 0; k < (R-L+1); k++) {
arr[L+k] = help[k];
}
return sum;
}
int smallSum(vector<int> arr,int L,int R){
if (L==R) {
return 0;
}
int mid = L+((R-L)>>1);
// 相当于 int mid = L+(R-L)/2;
int leftSum = smallSum(arr, L, mid);
int rightSum = smallSum(arr, mid + 1, R);
int leftAndRightSum = allSum(arr,L,mid,R);
return leftSum + rightSum + leftAndRightSum;
// return smallSum(arr, L, mid)+smallSum(arr, mid + 1, R)+allSum(arr,L,mid,R);
}
int InversePairs(vector<int> data) {
long length = data.size();
if( length<2){
return 0;
}
return smallSum(data,0,length );
}
};
java版
public class Solution {
public int InversePairs(int [] arr) {
if (arr == null || arr.length < 2) {
return 0;
}
return mergeSort(arr, 0, arr.length - 1)%1000000007;
}
public static int mergeSort(int[] arr, int l, int r) {
if (l == r) {
return 0;
}
int mid = (l + ((r - l) >> 1))%1000000007;
return mergeSort(arr, l, mid)%1000000007 + mergeSort(arr, mid + 1, r) %1000000007+ merge(arr, l, mid, r)%1000000007;
}
public static int merge(int[] arr, int l, int m, int r) {
int[] help = new int[r - l + 1];
int i = 0;
int p1 = l;
int p2 = m + 1;
int res = 0;
while (p1 <= m && p2 <= r) {
res += arr[p1] > arr[p2] ? (m - p1 + 1)%1000000007 : 0;
res = res%1000000007;
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= m) {
help[i++] = arr[p1++];
}
while (p2 <= r) {
help[i++] = arr[p2++];
}
for (i = 0; i < help.length; i++) {
arr[l + i] = help[i];
}
return res;
}
}