leetcode 493. Reverse Pairs

来源:互联网 发布:淘宝订单在线生成器 编辑:程序博客网 时间:2024/06/05 05:27

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:

  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.

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;    }};




原创粉丝点击