class Solution {
public:
int reversePairs(vector<int>& nums) {
vector<int> temp(nums.size());
return mergeSort(nums, 0, nums.size() - 1, temp);
}
private:
int mergeSort(vector<int>& nums, int begin, int end, vector<int>& temp) {
/*
0 1 2 3 4 | 5 6 7 8 9
|___|___|___|___|___|___|___|___|___|___|
0 1 2 | 3 4 | 5 6 7 | 8 9
|___|___|___|___|___| |___|___|___|___|___|
0 1 2 3 4 | 5 6 7 8 9
|___|___|___| |___|___| |___|___|___| |___|___|
0 1 2 3 4 | 5 6 7 8 9
|___|___| |___| |___|___| |___|___| |___| |___|___|
x x
*/
if (begin < end)
{
int mid = (begin + end) / 2;
// 递归左边 递归右边
int ret = mergeSort(nums, begin, mid, temp) + mergeSort(nums, mid + 1, end, temp);
// 0 1 2 3 4 | 5 6 7 8 9
// |___|___|___|___|___|___|___|___|___|___|
// begin mid mid+1 end
// i j
int i = begin; // 左边区间第一块
int j = mid + 1; // 右边区间第一块
for (int k = 0; k <= end - begin; k++)
{
/*
* 1.右边子数组小,先入。 即,左边子数组大
* 条件:右边小 nums[i] > nums[k]
* 条件:左边存在,如果左边不存在,只需要一直入右边,不存在逆序数
* i < mid
* 2.左边子数组小,先入。 或者右边子数组走完
* 条件:右边存在: j < end 条件转义至上一层 j >end
*/
if (i <= mid && (j > end || nums[i] <= nums[j]))
{
temp[k] = nums[i++];
ret += (j - mid - 1); // 右边下标 与 右边第一块 的距离
/*
0 1 2 3 4 5 6 7 8 9
a |_2_|___|___|___|___| b |___|___|_1_|___|___|
{....................} {.....3.....}
有序递增 有序
{ => => a中2 比 b中1 多了3个逆序数 }
nums[i] > nums[j]; ret += (j - (mid+1) );
*/
}
else temp[k] = nums[j++];
}
// 把该阶段完成归并后的temp部分,同步至原数组
memcpy(&nums[begin], &temp[0], (end - begin + 1) * sizeof(int));
return ret;
}
return 0;
}
};