在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
使用归并排序,排序的过程中统计逆序对;
class Solution {
int[] nums,temp;
public int reversePairs(int[] nums) {
this.nums = nums;
temp = new int[nums.length];
return mergeSort(0,nums.length-1);
}
public int mergeSort(int left,int right){
//终止条件
if(left >= right){
return 0;
}
//递归划分
//int mid = left + (left+right)>>1;
int mid = (left + right)/2;
int res = mergeSort(left,mid) + mergeSort(mid+1,right);
//合并阶段
int i = left,j = mid + 1;
for(int k = left;k <= right;k++){
temp[k] = nums[k];
}
for(int k = left;k <= right;k++){
if(i == mid + 1){
//超出左边界
nums[k] = temp[j++];
}else if(j == right + 1 || temp[i] <= temp[j]){
//超出右边界或者左边元素小于等于右侧
nums[k] = temp[i++];
}else if(temp[i] > temp[j]){
//左侧元素大于右侧元素
nums[k] = temp[j++];
res += mid - i + 1;
}
}
return res;
}
}
执行用时:33 ms, 在所有 Java 提交中击败了36.91%的用户
内存消耗:49.2 MB, 在所有 Java 提交中击败了46.05%的用户
通过测试用例:139 / 139