1、题目描述
2、解题思路
本题的难点在于:如何确定搜索边界
我们一开始先定义边界为 [0, 1],即 left = 0; right = 1;
下面就开始不断逼近合适的边界:
如果 reader.get(right) < target,说明左边界可以更新为 left = right,但是右边界不能简单的 right = right + 1,否则找边界就得找到猴年马月。
我们确定边界后,肯定是使用二分法来定位目标,因此,我们直接把右边界更新为 right = right × 2 是最合适的。
确定了左右边界后,剩下的就是最简单的二分查找。
3、解题代码
/**
* // This is ArrayReader's API interface.
* // You should not implement it, or speculate about its implementation
* interface ArrayReader {
* public int get(int index) {}
* }
*/
class Solution {
public int search(ArrayReader reader, int target) {
int left = 0;
int right = 1;
while (target > reader.get(right)) {
left = right;
right = right * 2;
}
int mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (reader.get(mid) < target) {
left = mid + 1;
} else if (reader.get(mid) > target) {
right = mid - 1;
} else {
return mid;
}
}
return -1;
}
}