【求解一题java面试题】,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
5.对于一个已经排好序的数组a,给定一个数X,判断该数组中是否存在2个数的和等于X
要求时间复杂度为0(n);
题目是搜下来的。。。。不给代码也行,最好给思路。。。
------解决方案--------------------
0(n),也就是要求一次遍历,整体算法是:两头定位,然后双头向中间进行搜索。
因为是排序好的,假定是升序好了,也就是左小右大。
1、从左右两端开始,比如 pLeft = 0 和 pRight = length-1
2、如果:v[pLeft] + v[pRight] > X,那么要缩小,也即pRight--;
3、如果:v[pLeft] + v[pRight] < X,那么要增大,也即pLeft++;
4、重复2、3直到命中或pLeft == pRight,这就失败了。
其它优化可以考虑快速失败的情况,比如:v[pLeft]>X,明显绝对不可能命中的了。
------解决方案--------------------1楼的思路很清晰,学习了。。。
------解决方案--------------------一楼牛啊