|
讲个思路吧,
先对两个数组分别排序,这样就可得到可能的最大和最小乘积MAX,MIN。
对MIN~MAX范围进行二分枚举,举个例:
1、假设当前枚举到的值为MID;
2、对于A[i], 可得到商D=MID/A[i], 用D到B中进行二分查找合适位置,这样就可以知道A[i]*B[j](j{0,m-1})时中大于MID的个数cnt,
3、重复2,循环i,相加每个cnt,最后的和即是当前MID的最终排名L
4、根据L与要找的K比较结果,确定下一个MID的范围[MIN, MID] OR [MID+1, MAX],得到MID,重复1直到L==K.
注:因为结果里面有相同的值,所以在对B进行二分查找合适位置,需要对找到的合适位置的前后进行进一步比较。
复杂度: m*log(MAX)*log(m)
二分枚举MID,O(log(MAX)),最大64
枚举A[i], O(m)
二分查找B, O(logm) |
|