题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
代码实现
归并排序(分治算法的应用)
class Solution {
int res = 0;
public int reversePairs(int[] nums) {
if (nums.length < 2){
return 0;
}
process(nums,0,nums.length-1);
return res;
}
public void process(int[] arr,int left,int right){
if (left == right){
return;
}
int mid = left + (right - left)/2;
process(arr,left,mid);
process(arr,mid+1,right);
merge(arr,left,mid,right);
}
public void merge(int[] arr,int left,int mid,int right){
int[] help = new int[right - left + 1];
int index = 0;
int l = left;
int m = mid+1;
while (l <= mid && m <= right){
if(arr[l] > arr[m]){
help[index++] = arr[m];
//构成逆序,当前l值已经比m值大了,则l到mid这段的值都比m值要大
res += mid - l + 1;
m++;
}
else {
help[index++] = arr[l];
l++;
}
}
while (l <= mid){
help[index++] = arr[l];
l++;
}
while (m <= right){
help[index++] = arr[m];
m++;
}
for (int i = 0; i < help.length; i++) {
arr[left+i] = help[i];
}
}
}