题目描述:给你一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
。请你找出给定目标值在数组中的开始位置和结束位置。
输入:nums = [5,7,7,8,8,8,10], target = 8 输出:[3,5]
解答:这道题因为数组是有序的,所以是用二分查找。需要注意的是下边界是数组中第一个大于等于target的元素下标,上边界是数组中第一个大于target的元素的下标减一。
所以二分查找下边界判断条件是nums[mid]>=target
查找上边界的判断条件是nums[mid]>target
可以合并这两次二分查找的代码。
具体程序如下:
vector<int> searchRange(vector<int>& nums, int target) {
int left = binarySearch(nums,target,true);
int right = binarySearch(nums,target,false)-1;
if(left<=right && right<nums.size()&&nums[left]==target&&nums[right]==target){
return vector<int>({left,right});
}
return vector<int>({-1,-1});
}
int binarySearch(vector<int>& nums, int target, bool lower){
int left = 0, right = nums.size()-1, res = nums.size();
while(left<=right){
int mid = left+(right-left)/2;
if(nums[mid]>target || (lower && nums[mid]>=target)){
right = mid-1;
res = mid;
}else{
left = mid+1;
}
}
return res;
}