给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。
示例 1:
输入: [1,3,2,3,1]
输出: 2
示例 2:
输入: [2,4,3,5,1]
输出: 3
注意:
    给定数组的长度不会超过50000。
    输入数组中的所有数字都在32位整数的表示范围内。
详见:https://leetcode.com/problems/reverse-pairs/description/

C++:

class Solution {
public:
int reversePairs(vector<int>& nums) {
int n = nums.size();
if(n <= 1)
{
return 0;
}
int cnt = 0;
vector<int> b(nums.begin(), nums.begin() + n / 2);
vector<int> c(nums.begin() + n / 2, nums.end());
cnt += reversePairs(b);
cnt += reversePairs(c);
int ai = 0, bi = 0, ci = 0;
while(ai < n)
{
if(bi < b.size() && (ci == c.size() || b[bi] <= c[ci]))
{
nums[ai++] = b[bi++];
}
else
{
long tmp2 = (long)c[ci]*2;
int low = 0,high = b.size() - 1,pos = bi;
while(low <= high)
{
pos = (low + high)/2;
if((long)b[pos] == tmp2)
{
low++;
}
else if((long)b[pos] > tmp2)
{
high = pos - 1;
}
else
{
low = pos + 1;
}
}
if(low < b.size() && low >= 0 && (long)b[low] > tmp2)
{
cnt += n/2 - low;
}
nums[ai++] = c[ci++];
}
}
return cnt;
}
};

参考:https://blog.csdn.net/lin360580306/article/details/60326795

05-12 08:24