This is an interactive problem.
You have a sorted array of unique elements and an unknown size. You do not have an access to the array but you can use the ArrayReader
interface to access it. You can call ArrayReader.get(i)
that:
- returns the value at the
ith
index (0-indexed) of the secret array (i.e.,secret[i]
), or - returns
2^31 - 1
if thei
is out of the boundary of the array.
You are also given an integer target
.
Return the index k
of the hidden array where secret[k] == target
or return -1
otherwise.
You must write an algorithm with O(log n)
runtime complexity.
Example 1:
Input: secret = [-1,0,3,5,9,12], target = 9 Output: 4 Explanation: 9 exists in secret and its index is 4.
Example 2:
Input: secret = [-1,0,3,5,9,12], target = 2 Output: -1 Explanation: 2 does not exist in secret so return -1.
Constraints:
1 <= secret.length <= 10^4
-10^4 <= secret[i], target <= 10^4
secret
is sorted in a strictly increasing order.
可以确定是用二分查找法,但题目给的是一个未知长度的数组,看起来很吓人,无法确定左右边界。但仔细一读题目会发现其实就是一道最普通的二分查找题。
题目给了一个API函数,可以输入一个数组索引,如果索引值是在数组长度范围内就返回对应的数值;如果超出范围则返回一个大数2^32 - 1来表示索引超出数组边界。另外题目的两个限制条件大大降低了题目难度。
1)数组的长度范围是1到10000,因此二分查找的边界可以是left=0, right=9999。
2)数组里数值和目标数范围是-10000 ~ 10000,因此即使我们输入的索引超出数组范围,API函数返回的大数也肯定大于目标数,仍然可以排除右半区间而继续寻找左半区间,所以对二分查找没有任何影响。
class Solution:
def search(self, reader, target):
"""
:type reader: ArrayReader
:type target: int
:rtype: int
"""
l, r = 0,9999
while l <= r:
mid = (l + r) // 2
v = reader.get(mid)
if v == target:
return mid
elif target < v:
r = mid - 1
else:
l = mid + 1
return -1