给你一个按照非递减顺序排列的整数数组
nums
,和一个目标值target
。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值
target
,返回[-1, -1]
。你必须设计并实现时间复杂度为
O(log n)
的算法解决此问题。
代码:
class Solution{
public int[] searchRange(int[] nums, int target) {
int left = search(nums,taget,true);// 查找目标值的左边界
int right = search(nums,target,false);// 查找目标值的右边界
return new int[]{left,right}; // 返回左右边界组成的数组
}
private int search(int[] nums, int target, boolean flag){
int left = 0, right = nums.length - 1;
int result = -1;// 结果初始化为-1,表示未找到目标值
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target) {
result = target;
if(flag){//查找左边界
right = mid - 1;/ 缩小右边界
}
else{ //查找右边界
left = mid + 1;/ 缩小左边界
}
}
else if(nums[mid] < target) {// 目标值在右半部分
left = mid + 1; // 缩小左边界
}
else{
right = mid - 1;// 缩小右边界
}
}
return result;
}
}