原题网址: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; } };