class Solution{
public:
vector<int> searchRange(vector<int>& nums, int target){
int left=0;
int right=nums.size()-1;
while(left<=right){
int middle=left+(right-left)/2;
if (nums[middle]>target){
right=middle-1;
}
eise if (nums[middle]<target){
left=middle+1;
}
else{
left=right=middle; //这个条件下就是存在目标值,然后将左右重新往两边搜索寻找边界值
while(left>=0 && nums[left]==target){
left--;
}
while(right<=nums.size()-1 && nums[right]==target){
right++;
}
return vector<int>{left+1,right-1};
}
}
return vector<int>{-1,-1};
}
};
题目:
给你一个按照非递减顺序排列的整数数组
nums
,和一个目标值target
。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target
,返回[-1, -1]
。你必须设计并实现时间复杂度为
O(log n)
的算法解决此问题。
第一个循环:while(left<=right),即左边和右边的标签值是可以相等的,对应去[left,right],即左右值都在取值范围内。
正是因为左右值都需要取到,因此当大于和小于的情况下,需要加一和减一,即把中间值不等于目标值的部分分隔开。
重点是在第三部分,取else时,nums[middle]==target,我采用的解法是最为直观的,将左右标签赋值为middle,然后分别往两边搜索,条件是取值仍然要为目标值。
最后取得的left和right值,已经是不符合条件的了,因此最后要重新加上1和减去1。