二分法 702. 搜索长度未知的有序数组[中等]
给定一个升序整数数组,写一个函数搜索 nums 中数字 target。如果 target 存在,返回它的下标,否则返回 -1。注意,这个数组的大小是未知的。你只可以通过 ArrayReader 接口访问这个数组,ArrayReader.get(k) 返回数组中第 k 个元素(下标从 0 开始)。
你可以认为数组中所有的整数都小于 10000。如果你访问数组越界,ArrayReader.get 会返回 2147483647。
题目分析:如果有序数组的长度是已知的,则可以直接套用二分法模板,因此需要首先计算数组长度。
class Solution {
public int search(ArrayReader reader, int target) {
int index = 1;
while(reader.get(index - 1) < target){
index = index * 2;
}
int start = index / 2;
int end = index - 1;
while(start + 1 < end){
int mid = start + (end - start) / 2;
if(reader.get(mid) == target){
return mid;
}else if(reader.get(mid) < target){
start = mid;
}else{
end = mid;
}
}
if(reader.get(start) == target){
return start;
}
if(reader.get(end) == target){
return end;
}
return -1;
}
}