用二分法寻找边界(力扣34)
问题:在一个升序数组中,要求找到给定target值在数组中的起始索引和结束索引。
分析:我最开始想到的方法是先用二分法在数组中找到任意一个值为 target 的索引,然后分别向前搜索找到左边界值、向后搜索找到右边界值。
好一点的方法是,分别用二分法找到左边界值和右边界值。
例如找左边界值时,如果 nums[middle] > target 时 left = middle + 1,如果 nums[middle] < target 或者 nums[middle] == target 时 right = middle - 1,这样子就能保证 left 跳过小于 target 的值,而 right 能跳过大于等于 target 的值,从而保证了找到左边界。
最后要注意左边界的值是 返回值 + 1,右边界的值是 返回值 - 1。
以下给出找左边界值的算法:
int getLeftBorder(int[] nums, int target)
{
int left = 0, right = nums.length - 1;
int leftBorder = -2 //用于判断是否修改了,未修改则不存在左边界值
while(left <= right)
{
int middle = left + (right - left) / 2;
if(target > nums[middle])
{
left = middle + 1;
}
else
{
right = middle - 1;
leftBorder = right; //更新左边界
}
}
return leftBorder; //注意左边界值还要加1
}