题目链接: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 };