搜索非重复序列里的元素
int left=0,right=nums.length()-1;//允许搜索到边界
while(left<=right)//程序终止的条件为left>right,所以可以访问到所有元素
{
mid=left+(right-left)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]<target)//不符合条件,搜索[left,mid)
left=mid+1;
else if(nums[mid]>target)//不符合条件,搜索(mid,right]
right=mid-1;
}
搜索序列里的左边界
可以理解成搜索序列里大于某个数的数字数量
int left=0,right=nums.length();
while(left<right)
{
mid=left+(right-left)/2;
if(nums[mid]==target)//因为是要搜索左边界,所以不能越过mid
right=mid;
else if(nums[mid]<target)
left=mid+1;//遇到小的,应该变为(left
else if(nums[mid]>target)
right=mid-1;//遇到大的,应该变为right)
}
return left;
搜索序列里的右边界
找有多少个数字是>=targetNumber的
int left=0,right=length();
while(left<right)//要允许搜索到两个边界
{
mid=left+(right-left)/2;
if(nums[mid]==target)//如果等于的话,就应该搜索下一个位置
left=mid+1;
else if(nums[mid]<target)
left=mid+1;
else if(nums[mid]>target)
right=mid-1;
}
return left-1;
上面三个的主要区别其实聚集在三个方面:
- 初始状态的确定
- 在搜索到数字时的边界更新 取决于目标值可能存在的区间,同时要放置left<right的情况时,无法更新的情况(因为right=mid或者left=mid)
- 返回值的确定