我们知道使用二分查找能找到值所在的位置。假如我们在找到值后仍然不断的更新指针会发生什么?我们可以利用这一点来找到最左边的以及最右边的值。
如果当nums[mid]==target时,使得 right=mid-1,那么最终会使得target在right的右边。
如果当nums[mid]==target时,使得 left=mid+1,那么最终会使得target在left的左边。
原因是因为我们会不断更新left和right,即使是找到了值仍然更新。当我们找到一个目标值使得 right=mid-1,实际上我们是将target值认为比target值大的,然后又要寻找target值。最后left不断逼近target,right不断往左去掉target。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.empty()) return {-1,-1};//除了forward_list外,所有容器都有的三个大小操作:size(),empty(),max_size()。返回值 是 列表初始化的
int left=0,right=nums.size()-1;
while(left<=right){//寻找最左边的元素
int mid=(left+right)>>1;
if(nums[mid]>=target) right=mid-1;
else left=mid+1;
}
if(left==nums.size()||nums[left]!=target) return vector<int>{-1,-1};//列表初始化的匿名对象
int ans=left;
left=0,right=nums.size()-1;
while(left<=right){//寻找最右边的元素
int mid=(left+right)>>1;
if(nums[mid]>target) right=mid-1;
else left=mid+1;
}
return {ans,left-1};//列表初始化的匿名对象,涉及到一个类类型的 隐式类型转换
}
};
涉及到的STL问题已经标注。