题目链接:Search for a Range
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm‘s runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
这道题的要求是在一个有序数组中,找到给定的target在数组中出现的起止位置。如果不存在,返回[-1, -1]。要求时间复杂度O(logn)。
由于要求O(logn)的时间复杂度,可以考虑采用二分搜索。可以先二分搜索,找到target出行的某个位置,然后再以该位置为中心向两边遍历,直到边界或者不等于target。不过这样最差情况下,时间复杂度为O(n)。
既然二分查找可以找到元素,那么也可以进而找到边界。两次二分搜索,分别找到左边界和有边界(即target和A[m]相等时不中断查找)。
时间复杂度:O(logn)
空间复杂度:O(1)
1 class Solution
2 {
3 public:
4 vector<int> searchRange(int A[], int n, int target)
5 {
6 int l1 = 0, r1 = n - 1, m1;
7 while(l1 <= r1)
8 {
9 m1 = (l1 + r1) / 2;
10 if(target <= A[m1])
11 r1 = m1 - 1;
12 else
13 l1 = m1 + 1;
14 }
15
16 int l2 = 0, r2 = n - 1, m2;
17 while(l2 <= r2)
18 {
19 m2 = (l2 + r2) / 2;
20 if(target >= A[m2])
21 l2 = m2 + 1;
22 else
23 r2 = m2 - 1;
24 }
25
26 if(l1 <= r2)
27 return vector<int>{l1, r2};
28 else
29 return vector<int>{-1, -1};
30 }
31 };