从一组有序数组中查找target第一次出现的位置
从有序数组中查找target 第一次出现的位置的数学关系如下:
假定 数组的左边的下标为:L, 右边的下标为R,则一定满足一下数学表达式
1.(L+1) ==R && arr[L] < target && arr[R] >= target
2.arr[L] < target, arr[R] >= target
综上两个条件,在java代码的实现中,设置为L=-1,R= n(n为数组的长度)
private static int binarySearchFirst(int[] arr,int target)
{
int L = -1;
int n = arr.length;
int R = n;
//设定目标索引值,从下标0开始,为了查找第一个元素
int p = 0;
while (L +1 != R)
{
int mid = (L+R) / 2;
if (arr[mid] < target)
{
L = mid;
}
else
{
R = mid;
}
//try catch用于检查数组下标越界,如果数组下标越界,就忽略
try
{
if ((L+1) == R && arr[L] < target && arr[R] >= target)
{
p = R;
}
}
catch(Exception e)
{
}
}
//判断查找到的目标值的索引是否有效
if (p >= n || arr[p] != target)
{
p = -1;
}
return p;
}