题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
分析
逆序对和归并排序紧密相连,相关题解看leetcode数组中的逆序对
下面给出代码:
class Solution {
public int res = 0;
public int reversePairs(int[] array) {
mergeSort(array,0,array.length-1);
return res;
}
public void mergeSort(int[] array,int left,int right) {
if(left >= right) {
return;
}
int mid = (left+right)/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[] temp = new int[right-left+1];
int k = 0;
int begin1 = left;
int begin2 = mid + 1;
while(begin1 <= mid && begin2 <= right) {
if(array[begin1] > array[begin2]) {
temp[k++] = array[begin2++];
res = res + mid - begin1 + 1;
} else {
temp[k++] = array[begin1++];
}
}
while(begin1 <= mid) {
temp[k++] = array[begin1++];
}
while(begin2 <= right) {
temp[k++] = array[begin2++];
}
for(int i = 0; i < temp.length; i++) {
array[left++] = temp[i];
}
}
}