给一个按照升序排序的正整数数组。这个数组很大以至于你只能通过固定的接口 ArrayReader.get(k) 来访问第k个数。(或者C++里是ArrayReader->get(k)),并且你也没有办法得知这个数组有多大。找到给出的整数target第一次出现的位置。你的算法需要在O(logk)的时间复杂度内完成,k为target第一次出现的位置的下标。
如果找不到target,返回-1。
样例
给出 [1, 3, 6, 9, 21, …], and target = 3, return 1.
给出 [1, 3, 6, 9, 21, …], and target = 4, return -1.
Python:
"""
Definition of ArrayReader:
class ArrayReader:
def get(self, index):
# this would return the number on the given index
# if there is no number on that index, return -1
"""
class Solution:
# @param {ArrayReader} reader: An instance of ArrayReader
# @param {int} target an integer
# @return {int} an integer
def searchBigSortedArray(self, reader, target):
index = 0
while reader.get(index) != -1 and reader.get(index) < target:
index = 2 * index + 1
left, right = 0, index
while left + 1 < right:
mid = (left + right) / 2
if reader.get(mid) == -1 or reader.get(mid) >= target:
# 需要考虑可能当前位置没有取值的情况
right = mid
else:
left = mid
if reader.get(left) == target:
return left
if reader.get(right) == target:
return right
return -1