315Count of Smaller Numbers After Self

本文介绍了一种利用归并排序算法计算数组中逆序对数量的方法。通过从大到小排序的方式,在合并过程中高效统计每个元素右侧比其大的元素数目,实现了O(N log N)的时间复杂度。

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

这题据说有2种做法,一是二叉搜索树。

我是基于 归并排序做的。 要求的是 每个数 比它右面多少个数要大。

那么假设 我 已经把一个数组分为两部分A B 显然A B内部每个数比自身右边多少个大已经递归求好了,那么关键就是合并。


刚开始走了弯路,试图按从小到大排序但是有问题,比如 a1,a2,a3  b1,b2,b3  假定a1<a2<a3 b1<b2<b3 如果有a1>b1 那么显然a2>b1 a3>b1 但是统计却非常困难,因为a1 a2 a3都需要加1个, 如果又有a1>b2 显然再得加一次,这样复杂度仍然是O(N^2)


后来想到,应该从大到小排序。比如a1>a2>a3 b1>b2>b3 如果a1>b1 我们就知道 这一轮 a1对应可以+3   然后如果a2<b1 那么再比a2>b2 就知道这一轮a2可以+2 由于归并时A在左B在右,因此仅有A里面的可能做加法。 而且从大到小排,保证A里面每个数仅加1次,也就做到了O(N)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值