LintCode : 搜索区间
题目
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
样例
给出[5, 7, 7, 8, 8, 10]和目标值target=8,
返回[3, 4]
思路
用二分法分别查找出目标值的左右边界。查找左边界时A[r]永远大于等于target,A[p]最后确定左边界。查找右边界是A[p]永远小于等于target, A[r]最后确定左边界。
代码
vector<int> searchRange(vector<int> &A, int target) {
vector<int> result(2, -1);
if(A.size() == 0) {
return result;
}
int p = 0;
int r = A.size() - 1;
while(p < r) {
int q = (p + r) / 2;
if(A[q] < target) {
p = q + 1;
}
else {
r = q;
}
}
if(A[p] == target) {
result[0] = p;
}
p = 0;
r = A.size()- 1;
while(p < r) {
int q = (p + r + 1) / 2;
if(A[q] > target) {
r = q - 1;
}
else {
p = q;
}
}
if(A[r] == target) {
result[1] = r;
}
return result;
}