重点:归并排序 的变种
import java.util.*;
public class Solution {
public static long ans = 0;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int InversePairs(int[] nums) {
if (nums.length == 0) return 0;
mergeSort(nums, 0, nums.length - 1);
return (int)(ans % 1000000007);
}
public void mergeSort(int[] array, int left, int right) {
if (left >= right) return;
int mid = left + (right - left) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid + 1, right);
merge(array, left, mid, right);
}
public void merge(int[] array, int left, int mid, int right) {
int l_pos = left;
int r_pos = mid + 1;
int pos = left;
int[] tempArray = new int[array.length];
while (l_pos <= mid && r_pos <= right) {
if (array[l_pos] <= array[r_pos]) {
tempArray[pos++] = array[l_pos++];
} else {
tempArray[pos++] = array[r_pos++];
// 计算逆序对
// 奥妙之处 此时发现逆序对 计数增加mid-l_pos+1,因为当前面的数组值array[l_pos]大于后面数组值array[r_pos]时;则前面数组array[l_pos]~array[mid]多个元素都是大于array[r_pos]的
ans += (mid - l_pos + 1);
ans %= 1000000007;
}
}
while (l_pos <= mid) {
tempArray[pos++] = array[l_pos++];
}
while (r_pos <= right) {
tempArray[pos++] = array[r_pos++];
}
// 将排序后的结果复制回原数组
while (left <= right) {
array[left] = tempArray[left];
left++;
}
}
}