给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
方法1:二分查找
返回数组中第一个大于等于target的位置,Solution类中的tar方法
注:传统的二分查找中,要求:
数组为有序数组
数组无重复元素
该题不满足第二条,无法直接使用二分
class Solution {
public:
//返回数组中第一个大于等于target的位置,如果所有数都小于target,返回长度
//left左边的数都小于target
//right右边的数都大于等于target
//最后一次循环,left等于right的时候(mid=left=right)
//不管left+1(mid所指小于target)还是right-1(mid所值大于等于target),left始终指向第一个大于等于target位置
int tar(vector<int>& nums, int target){
int left = 0,right = nums.size()-1;
while(left<=right){//一定是小于等于
int mid = (left + right)/2;
if(nums[mid] < target) left = mid+1;//一定是+1
else right = mid-1;//一定是-1
}
return left; //right + 1也可以
}
vector<int> searchRange(vector<int>& nums, int target) {
int start = tar(nums,target);
if(start == nums.size() || nums[start] != target) return{-1,-1};
int end = tar(nums,target+1) - 1;
return{start,end};
}
};