/*
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
输入: [7,5,6,4]
输出: 5
*/
//其实就是归并排序 在左侧的一个元素大于右数组的一个元素时 左侧元素本身以及左数组剩余的元素都能组成一个逆序对
class Solution {
private int count = 0;
public int reversePairs(int[] nums) {
int[] temp = new int[nums.length];
mergeSort(nums,0,nums.length-1,temp);
return count;
}
public void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid, temp);
mergeSort(arr, mid+1, right, temp);
merge(arr,left,mid,right,temp);
}
//return temp;
}
public void merge(int[] arr, int left, int mid, int right, int[] temp) {
int k = left;
int j = mid + 1;
int i = 0;
while (k <= mid && j <= right) {
if(arr[k]<=arr[j]){
temp[i++] = arr[k++];
}else{
count += mid-k+1;
temp[i++] = arr[j++];
}
}
while (k <= mid){
temp[i++] = arr[k++];
}
while (j <= right){
temp[i++] = arr[j++];
}
i = 0;
while(left <= right){
arr[left++] = temp[i++];
}
}
}