package jttl.jxresearch.com.hive.udf.test;
public class Sloution {
public static void main(String[] args) {
}
public int binarySearch(int[] arr,int target){
int left = 0;
int right = arr.length - 1;//定义target在左闭右闭合的区间范围里。
//由于target在一个闭合区间里,那么left=right的时候式子也成立,当left>right的时候式子不成立,则可以推出,while()循环条件是
//left<=right(取补集)。注意这里和农容易错,一定要注意推到。
//就是循环不变式满足:如果在循环的每一步,这个式子都是正确的,那么循环结束后,这个式子也正确。
//此问题中初始化时定义区间为[0,arr.length - 1],那么根据循环不变量原理则在循环的整个过程中这种模式是不变的
//都是闭区间的模式。我们可以根据此检验代码的正确性。
//因为left,right是闭合区间,所以left和right是可以取到的
while(left <= right){
int middle = left + (right - left) / 2;
if(target >arr[middle] ){
//如果要找的数比中间值大,说明在区间右边。根据循环不变式,那么当改变left指针的时候,其也是左边闭合的
//此时left的值应该能被取到,因此left=middle+1
left=middle+1;
}
if(target < arr[middle] ){
right=middle-1;//同理,right的值也能被取到
}
if(target == arr[middle] ){
return middle;
}
}
return right+1;
}
}
public int binarySearch2(int[] arr,int target){
int left = 0;
int right = arr.length;//注意此处定义的右边为数组的长度,因此其右端点的值是取不到的
//也就是左闭右开区间[left,right),因此left!=right,当left大于等于right的时候循环结束
//循环中的条件为left<right
while(left <right){
int middle = left + ((right - left) >> 1);
if(target >arr[middle] ){
//如果要找的数比中间值大,说明在区间右边。根据循环不变式,那么当改变left指针的时候,其也是左边闭合的
//此时left的值应该能被取到,因此left=middle+1
left=middle+1;
}
if(target < arr[middle] ){
//当要找的值比中间值小的时候,说明区间在左边,由于是左闭右开的区间,所以右端点
//不能被取到,如果当right=middle-1时候,值是有可能取到的,当right=middle时候
//由于要找的值是比middle小的,所以是不能被取到的,根据循环不变量原理区间是[0,right)
//right为middle时候取不到
right=middle;
}
if(target == arr[middle] ){
return middle;
}
}
//注意此时返回的是right
return right;
}