使用归并排序
class Solution {
public int reversePairs(int[] nums) {
if(nums.length <= 1) return 0;
int i = 0;
int k = 1;
int sum = 0;
while(k < nums.length){
sum += gb(nums, i, k);
if(i < nums.length)
i += 2 * k;
else{
i = 0; k *= 2;
}
}
return sum;
}
private int gb(int[] nums, int start, int k){
if(start + k >= nums.length)
return 0;
int end = start + 2 * k;
if(start + 2 * k >= nums.length){
end = nums.length;
if(nums[start + k - 1] > nums[start + k])
return k * (nums.length - (start + k));
}else{
if(nums[start + k - 1] > nums[start + k])
return k * k;
}
int[] new_nums = new int[end - start];
int i = start;
int j = start + k;
int c = 0;
int sum = 0;
while(i < start + k && j < end){
if(nums[i] > nums[j]){
new_nums[c] = nums[i];
i ++;
sum += end - j;
}else{
new_nums[c] = nums[j];
j ++;
}
c++;
}
while(i < start + k){
new_nums[c++] = nums[i++];
}
while(j < end){
new_nums[c++] = nums[j++];
}
for(int ci = 0; ci < c; ci ++){
nums[start + ci] = new_nums[ci];
}
return sum;
}
}