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.
Constraints
You may assume that all elements in the array are unique.
The value of each element in the array will be in the range [-9999, 9999].
The length of the array will be in the range [1, 10^4].
Approach
Links
GeeksforGeeks
ProgramCreek
YouTube
Examples
Input: array = [-1, 0, 3, 5, 9, 12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4
Input: array = [-1, 0, 3, 5, 9, 12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1
Solutions
/**
* Time complexity :
* Space complexity :
*/
/**
* // 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 low = 0, high = Integer.MAX_VALUE;
while(low <= high) {
int mid = low + (high-low)/2;
int val = reader.get(mid);
if(val == target) {
return mid;
} else if(val < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
}
/**
* Time complexity :
* Space complexity :
*/
/**
* // 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 high = 1;
while(reader.get(high) < target) {
high *= 2;
}
int low = high / 2;
while(low <= high) {
int mid = low + (high-low)/2;
int val = reader.get(mid);
if(val == target) {
return mid;
} else if(val < target) {
low = mid+1;
} else {
high = mid-1;
}
}
return -1;
}
}