题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
//逆序数问题
int reversePairs(vector<int>& nums, int left, int mid, int right)
{
vector<int> num;
int p1 = left;
int p2 = mid + 1;
int sum = 0;
while (p1 <= mid && p2 <= right)
{
if (nums[p1] <= nums[p2])
{
num.push_back(nums[p1++]);
}
else
{
sum += mid - p1 + 1;
num.push_back(nums[p2++]);
}
}
while (p1 <= mid)
{
num.push_back(nums[p1++]);
}
while (p2 <= right)
{
num.push_back(nums[p2++]);
}
for (int i = 0; i < num.size(); i++)
{
nums[left + i] = num[i];
}
return sum;
}
//逆序数问题递归函数
int reversePairs_sort(vector<int>& nums, int left, int right)
{
if (left == right)
{
return 0;
}
int mid = left + ((right - left) >> 1);
// small_sum_merge_sort(nums, left, mid);
// small_sum_merge_sort(nums, mid + 1, right);
// small_sum(nums, left, mid, right);
return reversePairs_sort(nums, left, mid) + reversePairs_sort(nums, mid + 1, right) + reversePairs(
nums, left, mid, right);
}