剑指 Offer 51. 数组中的逆序对(C++实现)

 剑指 Offer 51. 数组中的逆序对icon-default.png?t=N6B9https://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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值