解析
给定一个升序排列的整形数组,和一个目标值target, 找出给定目标值在数组中的开始位置和结束位置。
思路1-线性扫描
对target 检查每一个下标,对nums数组从左到右做线性遍历,当遇到target时中止,如果没有中止过,呢么target不存在,可以返回[-1, -1],如果我们找到了有效的左端点坐标,我们可以做第二遍线性扫描,这次从右往左进行,这一次第一次遇到的就是右边界.双向扫描,
思路2-二分查找
因为数组已经排序过,所以可以使使用二分搜索来定位左右下标。
引入一个布尔类型的left参数,指示我们在遇到target==nums[mid]时,如果left为true,就递归查询左区间、否则递归右区间。
public int[] searchRange(int[] nums, int target) {
int[] res={-1,-1};
int l=FindIndex(nums,target,true);
if(l==nums.length||nums[l]!=target){
return res;
}
res[0]=l;
res[1]=FindIndex(nums,target,false);
return res;
}
private int FindIndex(int[]nums,int target,boolean left){
int l=0;
int r=nums.length;
while(l<r){
int mid=(l+r)/2;
if(nums[mid]>target || left&&nums[mid]==target){
r=mid;
}
else{
l=mid+1;
}
}
return l;
}