493. 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:
- The length of the given array will not exceed
50,000
. - All the numbers in the input array are in the range of 32-bit integer.
1、这个题可以用线段树、divide and conquer来做。线段树我没想出来Tree[]里面存的是什么,所以用后者来做。
2、有一个数据比较恶心,所以换成long long
3、
upper_bound(迭代器1,迭代器2, value); //在递增数组中返回第一个大于value的迭代器
sort(迭代器1,迭代器2)
这一类的都是 [迭代器1,迭代器2)。是前闭后开,一定注意。
4、这个题和327. Count of Range Sum做法有点相似。都是分成两截,在两截内部有满足的情况,再加上两截之间的满足的情况,一起返回。
5、都是在递增序列中(非递减序列)找
upper_bound 大于 value的第一个迭代器
lower_bound 大于等于 value的第一个迭代器
class Solution {
public:
int reversePairs(vector<int>& nums)
{
if (nums.empty()) return 0;
vector<long long> lnums;
for (auto it : nums)
lnums.push_back(it);
return helper(lnums, 0, lnums.size() - 1);
}
int helper(vector<long long>& nums, int l, int r) //返回 [l,r]内的满足的
{
if (l == r) return 0;
int m = (l + r) / 2;
int ret = helper(nums, l, m) + helper(nums, m + 1, r);
//计算左右之间的
for (int i = m + 1; i <= r; i++)
{
auto it = upper_bound(nums.begin()+l, nums.begin()+m+1, nums[i] * 2); //在前面区间找 大于 后面区间每个值*2 的位置
ret += (nums.begin() + m + 1) - it;
}
sort(nums.begin() + l, nums.begin() + r + 1);
return ret;
}
};