数组中的逆序对(使用归并排序解决))
题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4] 输出: 5
思路
当j索引右边元素比左边i索引的元素小时,被赋给数组,则左边mid-i+1个元素都比j大
代码
import java.util.Arrays;
class Solution {
int res = 0;
public int reversePairs(int[] nums) {
Sort(nums,0,nums.length-1);
return res;
}
private void Sort(int[] arr , int l , int r){
if(l>=r)
return;
int mid = (l+r)/2;
Sort(arr,l,mid);
Sort(arr,mid+1,r);
if (arr[mid]>(arr[mid+1])) {
merge(arr,l,mid,r);
}
}
//此方法合并两个有序的区间,arr[l,mid] 和 arr[mid+1,r]
private void merge(int[] arr , int l , int mid , int r){
int[] temp = Arrays.copyOfRange(arr,l,r+1); //注意此拷贝函数是前闭后开的
int i = l;
int j = mid +1;
for (int k = l; k <= r; k++) {
if(i>mid){
arr[k] = temp[j-l]; //注意-l,原因是拷贝的数组temp索引是从0开始的,而要求是数组中的一段区间从l开始,故须减去偏移量
j++;
} else if(j>r){
arr[k] = temp[i-l];
i++;
}else if(temp[i-l]<=(temp[j-l])){
arr[k] = temp[i-l];
i++;
}else {
res += mid - i +1;
arr[k] = temp[j-l];
j++;
}
}
}
}