//方法:归并排序,等同于小和问题。升序排序,只要左大于右,左之后所有都大于右,直接加上。若遇到相等问题,先拷贝左
class Solution {//先写出一个标准的归并排序,再对其进行改造。
public int reversePairs(int[] nums) {
if(nums == null || nums.length < 2){
return 0;
}
//计算mid,左归并,右归并,左右合并。
return mergeSort(nums, 0, nums.length-1);
}
public int mergeSort(int[] nums, int l, int r){
if(l == r){
return 0;
}
int mid = l + ((r - l) >> 1);
return mergeSort(nums, l, mid) + mergeSort(nums, mid+1, r) + merge(nums, r, mid, l);
}
public int merge(int[] nums, int r, int mid, int l){
int[] help = new int[r - l + 1];
int i = 0;
int p1 = l;
int p2 = mid + 1;
int cnt =0;
while(p1 <= mid && p2 <= r){
if(nums[p1] <= nums[p2]){
help[i++] = nums[p1++];
}else if(nums[p1] == nums[p2]){
help[i++] = nums[p2++];
}else{
cnt += mid - p1 + 1;
help[i++] = nums[p2++];
}
}
while(p1 <= mid){
help[i++] = nums[p1++];
}
while(p2 <= r){
help[i++] = nums[p2++];
}
for(i = 0; i < help.length; i++){
nums[l+i] = help[i];
}
return cnt;
}
}
左程云 逆序对问题
于 2023-08-07 11:09:27 首次发布