- 这里翻转对的逻辑没有契合归并排序,但可以使用归并的性质
- 同样利用两边各自有序的性质,但是在合并之前查找翻转对
- 找完后再将两边合并
class Solution {
public:
int temp[50002];
int find_pairs(vector<int> &nums, int left, int right)
{
if(left >= right) return 0;
int mid = (left + right) >> 1;
long long ret = 0;
ret += find_pairs(nums, left, mid);
ret += find_pairs(nums, mid + 1, right);
int l1 = left, r1 = mid, l2 = mid + 1, r2 = right;
while(l1 <= r1 && l2 <= r2)
{
if(nums[l1] / 2.0 > nums[l2])
{
ret += r2 - l2 + 1;
l1++;
}
else
l2++;
}
l1 = left, l2 = mid + 1;
int index = 0;
while(l1 <= r1 && l2 <= r2)
{
if(nums[l1] < nums[l2])
temp[index++] = nums[l2++];
else
temp[index++] = nums[l1++];
}
while(l1 <= r1) temp[index++] = nums[l1++];
while(l2 <= r2) temp[index++] = nums[l2++];
for(int i = 0; i < index; i++)
nums[left + i] = temp[i];
return ret;
}
int reversePairs(vector<int>& nums) {
return find_pairs(nums, 0, nums.size() - 1);
}
};