树状数组——逆序对(经典应用)

博客介绍了数组中逆序对的求解方法,采用离散化加树状数组。将数组元素离散化后,利用前缀和思想查找比当前元素大的元素数量,更新答案并插入树状数组。时间复杂度为O(nlogn),空间复杂度为O(n)。

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

数组中的逆序对

离散化+树状数组

        将数组的元素按去重后的长度重新分配大小,离散化后方便利用树状数组进行处理。如[1000,1500,1250,2000,1000]离散化后变为[1,3,2,4,1],枚举离散化后的数组元素,用前缀和思想查找有多少个元素比当前元素大,然后更新答案,将当前的元素插入到树状数组中。

class Solution {
public:
    vector<int> a;
    int tr[50010];
    int n,ans;
    int lowbit(int x){return x&-x;};
    void add(int x,int k){
        for(int i=x;i<=n;i+=lowbit(i)){
            tr[i]+=k;
        }
    }
    int query(int x){
        int res=0;
        for(int i=x;i;i-=lowbit(i)) res+=tr[i];
        return res;
    }
    int reversePairs(vector<int>& nums) {
        a=nums;
        n=nums.size();
        sort(a.begin(),a.end());
        int len=unique(a.begin(),a.end())-a.begin();
        for(auto &c:nums){
            c=lower_bound(a.begin(),a.begin()+len,c)-a.begin()+1;
            ans+=query(len)-query(c);
            add(c,1);
        }
        return ans;
    }
};

时间复杂度:O(nlogn),排序的复杂度nlogn,逆序对查找为nlogn。

空间复杂度:O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值