LeetCode 702. Search in a Sorted Array of Unknown Size - 二分查找(Binary Search)系列题17

这是一个交互式问题,涉及在未知大小的有序数组中使用二分查找找到特定元素的索引。通过提供的API接口获取数组中指定索引的值或确认索引是否超出范围。由于数组严格递增,可以应用二分查找策略。题目限制了数组长度在1到10000之间,数值范围在-10000到10000,这些条件简化了问题,使得即使API返回大数也能有效进行二分查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 the i 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值