【Leetcode】702. Search in a Sorted Array of Unknown Size

题目地址:

https://leetcode.com/problems/search-in-a-sorted-array-of-unknown-size/

给定一个长度未知的有序数组,再给定一个数target,要求返回其在数组中的下标。如果不存在则返回 − 1 -1 1

可以使用倍增法先找到target所在的区间,然后用二分法寻找其下标。代码如下:

public class Solution {
     
    public int search(ArrayReader reader, int target) {
     
    	// l和r代表要寻找target的区间
        int l = 0, r = 1;
        while (reader.get(r) < target) {
     
        	// 如果右端点的数小于target,
        	// 说明target在r或者r的右边,此时右移左端点到r,并将r加倍
            l = r;
            r <<= 1;
        }
        
        while (l < r) {
     
            int m = l + (r - l >> 1);
            if (reader.get(m) < target) {
     
                l = m + 1;
            } else if (reader.get(m) > target) {
     
                r = m - 1;
            } else {
     
                return m;
            }
        }
        // 注意到二分结束后还剩下一个候选答案,需要额外判断一下
        return reader.get(l) == target ? l : -1;
    }
}

interface ArrayReader {
     
    int get(int index);
}

时间复杂度 O ( log ⁡ n ) O(\log n) O(logn),空间 O ( 1 ) O(1) O(1)

你可能感兴趣的:(#,二分,位运算与数学,二分法,leetcode,数据结构,算法)