LeetCode 702. Search in a Sorted Array of Unknown Size
2021-01-27 16:49:56 # leetcode

Problem

LeetCode 702. Search in a Sorted Array of Unknown Size

1. 题目简述

题目不赘述了,具体点击链接查看。

2. 算法思路

这道题很有意思,数组的大小是未知的,因此,我们需要将其分解成两个子问题。第一,确定二分查找的子区间;第二,二分查找哦啊该区间。

首先,我们定义l = 0, r = 1,直到reader.get(l) <= target <= reader.get(r)。然后二分查找该区间。算法复杂度为O(logN)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* // This is ArrayReader's API interface.
* // You should not implement it, or speculate about its implementation
* interface ArrayReader {
* public int get(int index) {}
* }
*/

class Solution {
public int search(ArrayReader reader, int target) {
if (reader.get(0) == target) {
return 0;
}

// 两个子问题,第一个是确认左右边界。这里left初始化为0,right初始化为1,然后每次get右边界。如果右边界<target,那么left=right + 1,right = right * 2。找到合适的区间后再想办法做二分。
int l = 0, r = 1;
while (reader.get(r) < target) {
l = r + 1;
r = r * 2;
}

// 此时,target一定是在[l,r]之间
while (l < r) {
int mid = l + r >> 1;
if (reader.get(mid) == target) {
return mid;
} else if (reader.get(mid) > target) {
r = mid - 1;
} else {
l = mid + 1;
}
}

if (reader.get(l) == target) {
return l;
}

return -1;
}
}