Reverse Pairs

来源:互联网 发布:哪个直播软件有黄播 编辑:程序博客网 时间:2024/06/05 18:11

 Reverse Pairs

Given an array nums, we call (i, j) an important reverse pair if i < j and nums[i] > 2*nums[j].

You need to return the number of important reverse pairs in the given array.

Example1:

Input: [1,3,2,3,1]Output: 2

Example2:

Input: [2,4,3,5,1]Output: 3

Note:

  1. The length of the given array will not exceed 50,000.
  2. All the numbers in the input array are in the range of 32-bit integer.
解析:

利用归并排序的思路,也叫分割重现关系,用式子表示是T(i,j)=T(i,m)+T(m+1,j)+C,其中C表示翻转对的两个数字分别在子数组nums[i,m]和nums[m+1,j]之间,满足要求的翻转对数,若果我们对这两个数组都是排好序的,那么可以在线性时间内求出翻转对数,我们利用递归思路对两个子数组排序然后求翻转对数。

代码:

class Solution {public:    int reversePairs(vector<int>& nums) {                return mergesort(nums,0,nums.size()-1);    }        int mergesort(vector<int> &nums, int left,int right)    {              if (left>=right)       return 0;       int mid=(left+right)/2;       int ans=0;       ans=mergesort(nums,left,mid)+mergesort(nums,mid+1,right);              int first=mid;       int second=right;       while ((first>=left)&&(second>=(mid+1)))       {           long long t1=nums[first];           long long t2=(long long )(nums[second])*2;           if (t1>t2)           {               ans+=(second-mid);               first--;           }           else           {               second--;           }       }       sort(nums.begin()+left,nums.begin()+right+1);       return ans;                  }        };



0 0
原创粉丝点击