二分找最左边
核心思想: 先mid =(l+r)/2每次向左取整; 然后命中target的时候,右边界逼近到mid;
因为每次mid向左取整,mid命中target时l代替mid位置,则循环迭代最后会卡出重复数字最左侧的位置!
可以用int arr[5] = 3 3 3 3 3 ; int target = 3; 这种极端的用例,来方便理解一下上述二分算法!
//二分找k的最左侧位置
while(l<r)
{
mid = (l+r)>>1; //mid向左取整
if(arr[mid]>=target ) r = mid;//mid命中时右边界r代替mid位置(二分区间整体向左收缩了)
else l = mid+1;
}
寻找过程图示如下:
二分找最右边
核心思想: 先mid =(l+r+1)/2 每次向右取整; 然后命中target的时候,左边界逼近到mid;
因为每次mid向右取整,mid命中target时l代替mid位置,则循环迭代最后会卡出重复数字最右侧的位置! 同上,不过多解释;
//二分找target的最右侧位置