给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
要求时间复杂度为 O(log n)
解题思路:
由于需要时间复杂度 O(log n),
因此很容易想到使用二分查找。但与一般的二分查找不同的是,二分查找一般在找到目标值后就立刻返回,但这里我们要查找的目标值的左右边界。因此在满足(target==nums[mid])后,不直接返回,而是继续往左或往右查找直到遇到边界。
代码如下:
//运用二分查找的思想,查找target的左右边界位置
public int[] searchRange(int[] nums, int target) {
int[] res=new int[2];
res[0]=findRes(nums,target,true);
res[1]=findRes(nums,target,false);
return res;
}
//flag为true表示搜索左边界,flag为false表示搜索右边界
private int findRes(int[] nums, int target, boolean flag) {
int left=0;
int right=nums.length-1;
int mid;
int res=-1;
while (left<=right){
mid=left+(right-left)/2;
if(target<nums[mid]){
right=mid-1;
}else if(target>nums[mid]) {
left=mid+1;
}else {
res=mid;
if(flag){
right=mid-1;
}else {
left=mid+1;
}
}
}
return res;
}