在两个有序数组中找第N数(算法)
2015-08-20 11:09
190 查看
对于 k <= x+y+1 还是 k > x+y+1 我们都提出了解决的方案,并且每种方案都能把 A 或者 B 的规模减小一半。减小了一半之后,我们将其作为一个新的问题继续使用上面的算法处理,直到 A 或者 B 减小到足够小:
A 没有了,这样只需要找出 B 中第 k 大的元素,也就是 B[k]。
B 没有了,同上结果就是 A[k]。
A 没有了,这样只需要找出 B 中第 k 大的元素,也就是 B[k]。
B 没有了,同上结果就是 A[k]。
public class NumX { private int[] a; private int[] b; public int find(int aLeft, int aRight, int bLeft, int bRight, int k) { if (aLeft > aRight) return b[bLeft+k-1]; if (bLeft > bRight) return a[aLeft+k-1]; int aMid = (aLeft + aRight) / 2; int bMid = (bLeft + bRight) / 2; if (a[aMid] <= b[bMid]) { if (k <= (aMid-aLeft) + (bMid-bLeft) + 1) return find(aLeft, aRight, bLeft, bMid-1, k); else return find(aMid+1, aRight, bLeft, bRight, k-(aMid-aLeft)-1); } else { if (k <= (aMid-aLeft) + (bMid-bLeft) + 1) return find(aLeft, aMid-1, bLeft, bRight, k); else return find(aLeft, aRight, bMid+1, bRight, k-(bMid-bLeft)-1); } } }
相关文章推荐
- Javascript(一)-05-(JS语法-算术运算符)
- Dijkstra最短路算法
- CSS透明度设置
- c++常见面试题30道
- GAP平台前进之路
- HDU 1796 How many integers can you find
- Qt入门之常用qt控件认知之QLayout
- Android 开发工具类 36_ getSimSerial
- JS实现的Select三级下拉菜单代码
- 为docker ceph集群添加mon
- linux 命令 xxd
- HDU 2680 Choose the best route <SPFA算法+反向建图>
- 自己写的一个简单的迅雷下载支持断点续传
- CentOS 6.5 配置IP地址的三种方法
- Netty
- Javascript(一)-04-(JS语法-变量)
- SAS JAVA jar包
- Mybatis中联合查询
- SPOJ PGCD - Primes in GCD Table (好题! 莫比乌斯反演+分块求和优化)
- 使用shell脚本清空文件