package com.wsy.sword;
public class InversePairs {
/*
* 思路:采用归并排序,合并是每次arr[i] > arr[j],则count响应加上j-mid
*/
public int inversePairs(int [] array) {
if(array == null || array.length <= 1) {
return 0;
}
return mergeSort(array, 0, array.length - 1, new int[array.length]) % 1000000007;
}
public int mergeSort(int[] arr, int start, int end, int[] temp) {
if(start < end) {
int mid = (start + end) >> 1;
int leftCount = mergeSort(arr, start, mid, temp) % 1000000007;
int rightCount = mergeSort(arr, mid + 1, end, temp) % 1000000007;
return (merge(arr, start, mid, end, temp) + leftCount + rightCount) % 1000000007;
}
return 0;
}
public int merge(int[] arr, int start, int mid, int end, int[] temp) {
int i = mid; // 左指针
int j = end; //右指针
int index = end; //临时数组指针
int count = 0;
while(i >= start && j >= mid +1) {
if(arr[i] > arr[j]) {
count = (count + j - mid) % 1000000007; // 核心代码
temp[index--] = arr[i--];
}else {
temp[index--] = arr[j--];
}
}
while(i >= start) {
temp[index--] = arr[i--];
}
while(j > mid) {
temp[index--] = arr[j--];
}
index = end;
while(start <= end) {
arr[end--] = temp[index--];
}
return count;
}
}
数组中的逆序对
最新推荐文章于 2022-03-27 13:15:54 发布