当前位置:   article > 正文

每日OJ题_分治归并④_力扣493. 翻转对

每日OJ题_分治归并④_力扣493. 翻转对

目录

力扣493. 翻转对

解析代码


力扣493. 翻转对

493. 翻转对

难度 困难

给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对

你需要返回给定数组中的重要翻转对的数量。

示例 1:

输入: [1,3,2,3,1]
输出: 2

示例 2:

输入: [2,4,3,5,1]
输出: 3

注意:

  1. 给定数组的长度不会超过50000
  2. 输入数组中的所有数字都在32位整数的表示范围内。
  1. class Solution {
  2. public:
  3. int reversePairs(vector<int>& nums) {
  4. }
  5. };

解析代码

        大思路与求逆序对的思路一样,就是利用归并排序的思想,将求整个数组的翻转对的数量,转换成三部分:

  • 左半区间翻转对的数量。
  • 右半区间翻转对的数量。
  • 一左一右选择时翻转对的数量。

        重点就是在合并区间过程中,如何计算出翻转对的数量。 与上个问题不同的是,上一道题我们可以一边合并一遍计算,但是这道题要求的是左边元素大于右边元素的两倍,如果我们直接合并的话,是无法快速计算出翻转对的数量的。

        例如 left = [4, 5, 6] right = [3, 4, 5] 时,如果是归并排序的话,需要计算 left 数组中有多少个 能与 3 组成翻转对。但是我们要遍历到最后一个元素 6 才能确定,时间复杂度较高。 因此需要在归并排序之前完成翻转对的统计。因为左右区间是有序的,所以使用双指针统计。

这里用升序(也可以用降序):

  1. class Solution {
  2. vector<int> tmp;
  3. public:
  4. int reversePairs(vector<int>& nums) {
  5. tmp.resize(nums.size());
  6. return mergeSortCnt(nums, 0, nums.size() - 1);
  7. }
  8. int mergeSortCnt(vector<int>& nums, int left, int right)
  9. {
  10. if(left >= right)
  11. return 0;
  12. int ret = 0, mid = (left + right) >> 1;
  13. // 先计算左右两侧翻转对数量
  14. ret += mergeSortCnt(nums, left, mid);
  15. ret += mergeSortCnt(nums, mid + 1, right);
  16. // 计算翻转对数量
  17. int cur1 = left, cur2 = mid + 1, i = left;
  18. while(cur2 <= right) // 升序的情况
  19. {
  20. while(cur1 <= mid && nums[cur2] >= nums[cur1] / 2.0)
  21. {
  22. cur1++;
  23. }
  24. if(cur1 > mid)
  25. break;
  26. ret += mid - cur1 + 1;
  27. cur2++;
  28. }
  29. // 合并两个有序数组
  30. cur1 = left, cur2 = mid + 1;
  31. while(cur1 <= mid && cur2 <= right)
  32. tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
  33. while (cur1 <= mid)
  34. tmp[i++] = nums[cur1++];
  35. while (cur2 <= right)
  36. tmp[i++] = nums[cur2++];
  37. for (int j = left; j <= right; j++)
  38. nums[j] = tmp[j];
  39. return ret;
  40. }
  41. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/194490
推荐阅读
相关标签
  

闽ICP备14008679号