题目地址:
https://www.lintcode.com/problem/search-in-a-sorted-array-of-unknown-size/description
给定一个长度非常长且长度未知的严格升序数组,再给定一个数 t t t,问 t t t在数组中的下标是多少。如果不存在则返回 − 1 -1 −1。数组的数的访问可以由一个接口ArrayReader调用get方法得到。
思路是倍增 + 二分。先用倍增找到右边界,然后二分。代码如下:
public class Solution {
/**
* @reader: reader.get(k) returns the element of the array at index k (0-indexed).
* @return: return target index
*/
public int search(ArrayReader reader, int target) {
// write your code here
// 用倍增找到第一个大于等于target的位置
int r = 1;
while (reader.get(r) < target) {
r <<= 1;
}
// 然后二分
int l = 0;
while (l < r) {
int m = l + (r - l + 1 >> 1);
if (reader.get(m) <= target) {
l = m;
} else {
r = m - 1;
}
}
return reader.get(l) == target ? l : -1;
}
}
interface ArrayReader {
int get(int k);
}
时间复杂度 O ( log n ) O(\log n) O(logn), n n n为数组长度,空间 O ( 1 ) O(1) O(1)。