1
em70 2014-08-17 13:32:07 +08:00
A,B数组长度相等吗
|
3
wisatbff 2014-08-17 14:07:19 +08:00
先排序,然后就不用说了吧
|
4
freetg 2014-08-17 14:08:03 +08:00
k=0
for i in xrange(n-1): for j in xrange(i+1, n-1): if A[i] < B[j]: k += 1 print k |
6
yangff 2014-08-17 14:11:09 +08:00 via Android
树状数组
|
8
em70 2014-08-17 14:57:48 +08:00
遍历肯定可以解决,算法复杂度2^n,主要你希望简化到多少?
|
9
takato 2014-08-17 15:04:14 +08:00 via iPhone
O(nlogn)
|
10
luoluoluo OP |
11
bcxx 2014-08-17 15:15:38 +08:00
@luoluoluo 试试可以将两个数组进行基排(或者其他 O(n) 的排序算法),然后再遍历两个数组,用类似归并排序的方法来逐个比较就可以了。这样就 O(n) 吧
|
12
xjx0524 2014-08-17 15:15:42 +08:00 1
两个数组分别排序O(nlog(n))
遍历A数组,对其中每个元素在B中二分,可以知道有多少比他大的 这样时间复杂度O(nlog(n)) |
15
GtDzx 2014-08-17 15:25:40 +08:00 1
线段树或者树状数组 复杂度O(nlogn)
元素取值范围足够大的话,应该不存在O(n)算法。否则可以通过构造这类问题来O(n)解决n个元素排序问题。(这点我没想太仔细,不过感觉是上可以这样证明复杂度下限的 :P) |
16
luoluoluo OP |
19
xjx0524 2014-08-17 15:43:03 +08:00
@luoluoluo
我说的那种二分的方法,假设n为B数组元素个数 遍历A数组,拿a[i]在B中二分,找到位置使b[j]<=a[i]且b[j+1]>a[i],那么总结果就加上n-j-1(如果数组索引从0开始) 对A数组中每个元素都这么做时间复杂度O(nlogn) |
20
glasslion 2014-08-17 15:45:43 +08:00
keyword: 逆序数
|
23
shoumu 2014-08-17 16:17:41 +08:00
|
25
joying 2014-08-17 16:58:19 +08:00
时间复杂度O(nlogn),先对两数组排序,后遍历A数组,对B数组进行二分查找,找到刚好比A[i]小的数的下标j,通过下标即可知道比A[i]大的B[j]的数量。
可以再优化,对B数组的二分查找不必从0开始,而是从刚好比A[i]小的B[j]开始。 |
26
aheadlead 2014-08-17 17:38:20 +08:00 via iPhone
记得有个很奇妙的方法可以做到 线性时间复杂度
|
27
xjx0524 2014-08-17 17:50:06 +08:00
@joying 哥们咱俩思路一样,但其实是错的,题目要求的不是任意i,j使得a[i]<b[j],是要求i < j时 A[i] < B[j],一排序就乱了。。。
|
28
Exin 2014-08-17 17:52:10 +08:00
不太明白你们为什么说排序……
我想角标和本身的值可以看做两个等价的属性, 那么排序前角标是有序的,排序后值是有序的, 那么排序应该是没有意义的。 能解释下吗? |
29
yangff 2014-08-17 17:58:12 +08:00 via Android
不可能做到线性
如果让A=B 那么问题就变成求A的逆序对数 A的逆序对数的已知最优复杂度是O(nlgn) 故原问题复杂度不可能小过O(nlgn) |
31
luoluoluo OP |
32
aheadlead 2014-08-17 19:35:37 +08:00
- - 好像看错了 是不是求逆序对啊...
|
33
yangff 2014-08-17 20:48:54 +08:00 via Android
@luoluoluo 窝系统挂了。。
你百度一下树状数组求逆序对,然后把查询比Ai小的变成查询比Bi小的就可以了 |
35
tideline 2014-08-17 22:54:44 +08:00
这应该是一个稍作变形的逆序对问题吧,用树状数组写了一下,时间复杂度O(nlogn),代码: http://paste.ubuntu.com/8071502/
这个版本的缺陷在于对数的大小有限制(数组里不能有负数和太大的数),可以离散化改进一下 |