剑指 Offer 51. 数组中的逆序对https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
通过归并排序计算逆序对
在进行归并排序的过程中,其实就是对逆序对进行整理的过程
在每次merge时,可以计算出对应的逆序对数量,最后再对结果相加
class MergeSort
{
private:
void sort(vector<int>& nums, const int left, const int right)
{
// base case
if (left >= right)
{
return;
}
int mid = left + (right - left) / 2;
sort(nums, left, mid);
sort(nums, mid + 1, right);
merge(nums, left, mid, right);
}
void merge(vector<int>& nums, const int left, const int mid, const int right)
{
for (int i = left; i <= right; ++i)
{
temp[i] = nums[i];
}
// 计算逆序对
int end = mid + 1;
for (int i = left; i <= mid; ++i)
{
while (end <= right && temp[i] > temp[end])
{
++end;
}
counter += end - mid - 1;
}
int i = left, j = mid + 1;
for (int k = left; k <= right; ++k)
{
if (i == mid + 1)
{
nums[k] = temp[j++];
}
else if (j == right + 1)
{
nums[k] = temp[i++];
}
else if (temp[i] <= temp[j])
{
nums[k] = temp[i++];
}
else
{
nums[k] = temp[j++];
}
}
}
public:
int sort(vector<int>& nums)
{
int n = nums.size();
temp.resize(n);
sort(nums, 0, n - 1);
return counter;
}
private:
int counter = 0;
vector<int> temp;
};
int reversePairs(vector<int>& nums) {
MergeSort ms;
return ms.sort(nums);
}