61 搜索区间
原题网址:https://www.lintcode.com/problem/search-for-a-range/description
描述
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
您在真实的面试中是否遇到过这个题?
样例
给出[5, 7, 7, 8, 8, 10]
和目标值target=8
,
返回[3, 4]
挑战
时间复杂度 O(log n)
标签
二分法
数组
排序数组
思路:二分查找,找到后用两根指针分别向前移动找到起始位置、向后移动找到结束位置。注意边界元素。
初始代码没有考虑空集或者没找到的情况囧……考虑问题还是要全面,不能因为做过类似的题就大意。
start、end初值设为-2是为了判断是否在数组中找到target,初值不为-1是因为找到后若起始位置为0 start会变成-1,但end不会,所以如果判断条件是 start==-1&&end==-1 初值也可以都是-1……
AC代码:
class Solution {
public:
/**
* @param A: an integer sorted array
* @param target: an integer to be inserted
* @return: a list of length 2, [index1, index2]
*/
vector<int> searchRange(vector<int> &A, int target) {
// write your code here
int size=A.size();
int left=0,right=size-1,middle=(left+right)/2;
int start=-2,end=-2;
vector<int> result(2,-1);
//二分查找;
while(left<=right)
{
if (A[middle]==target)
{
start=middle;
end=middle;
while(start>=0&&A[start]==target)
{
start--;
}
while(end<=size-1&&A[end]==target)
{
end++;
}
break;
}
else if (A[middle]<target)
{
left=middle+1;
middle=(left+right)/2;
}
else
{
right=middle-1;
middle=(left+right)/2;
}
}
if (start==-2&&end==-2)//没找到;
{
return result;
}
start+=1;
end-=1;
result[0]=start;
result[1]=end;
return result;
}
};
还可以使用库函数 lower_bound和upper_bound,参考:https://blog.csdn.net/wangyuquanliuli/article/details/46642637
C++中lower_bound函数和upper_bound函数