leetcode 493. Reverse Pairs

本文介绍了一种使用分治法解决重要逆序对问题的方法,通过实例详细展示了如何在给定数组中寻找满足特定条件的逆序对,并强调了在递增序列中查找的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值