利用二分找到第一个和最后一个匹配。
class Solution {
public:
int findFirst(int a[], int n, int start, int end, int key)
{
while(start <= end)
{
int mid = (start + end) >> 1;
if(a[mid] >= key) end = mid - 1;
else start = mid + 1;
}
if(start >= n || a[start] != key) return -1;
else return start;
}
int findLast(int a[], int n, int start, int end, int key)
{
while(start <= end)
{
int mid = (start + end) >> 1;
if(a[mid] > key) end = mid - 1;
else start = mid + 1;
}
if(end < 0 || a[end] != key) return -1;
else return end;
}
vector<int> searchRange(int A[], int n, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<int>ans;
ans.push_back(findFirst(A, n, 0, n - 1, target));
ans.push_back(findLast(A, n, 0, n - 1, target));
return ans;
}
};