- 题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数
- 示例
输入: [7,5,6,4]
输出: 5
- 算法
求逆序对,就是求每个数前面有几个数比他大。
在归并排序时,当左组中的nums[i]>右组中的nums[j]时,共有mid-i+1个数比nums[j]大
所以可以利用归并排序解决
- 代码
class Solution {
public int merge(int[] nums, int left, int mid, int right) {
int[] help = new int[right - left +1];
int i = left;
int k = 0;
int j = mid + 1;
int res = 0;
while (i <= mid && j <= right) {
if (nums[i] > nums[j]) {
res += mid - i + 1;
help[k++] = nums[j++];
} else {
help[k++] = nums[i++];
}
}
while (i <= mid) {
help[k++] = nums[i++];
}
while (j <= right) {
help[k++] = nums[j++];
}
for (i = left, k = 0; i <= right; i++) {
nums[i] = help[k++];
}
return res;
}
public int mergeSort(int[] nums, int left, int right) {
if (right <= left) {
return 0;
}
int mid = left + (right - left) / 2;
return mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right) + merge(nums, left, mid, right);
}
public int reversePairs(int[] nums) {
return mergeSort(nums, 0, nums.length-1);
}
}