Given an integer array sorted in ascending order, write a function to search target
in nums
. If target
exists, then return its index, otherwise return -1
. However, the array size is unknown to you. You may only access the array using an ArrayReader
interface, where ArrayReader.get(k)
returns the element of the array at index k
(0-indexed).
You may assume all integers in the array are less than 10000
, and if you access the array out of bounds, ArrayReader.get
will return 2147483647
.
Example 1:
Input:array = [-1,0,3,5,9,12],
target = 9
Output: 4 Explanation: 9 exists in nums and its index is 4
思路: binary search,end进行2倍扩张,确定了右边界,剩下的就是normal binary search;注意return -1 if 没有找到;
/**
* // 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 start = 0;
if(reader.get(0) == target) {
return 0;
}
int end = getUpperBound(reader, target);
while(start + 1 < end) {
int mid = start + (end - start) / 2;
if(reader.get(mid) == target) {
return mid;
} else if(reader.get(mid) > target) {
end = mid;
} else {
start = mid;
}
}
if(reader.get(start) == target) {
return start;
}
if(reader.get(end) == target) {
return end;
}
return -1;
}
private int getUpperBound(ArrayReader reader, int target) {
int i = 1;
while(reader.get(i) < target) {
i = i * 2;
}
return i;
}
}