1.对于程序边界,你一定要维护住自己的标准,不能变。
2.注意循环不变量
package ShiyiQi;
/**
* Created by xurui on 2017/11/7.
*/
class binarySearch{
public int binarySearch(int arr[], int n, int target){
//[]为数学上的双闭区间的意思
int l = 0 , r = n-1;//在[l...r]的范围内寻找target
while( l <= r ) {//当l == r的时候,区间[l..r]仍然是有效的
int mid = (l+r)/2;
if(target == mid)
return mid;
if(target > mid){
l = mid + 1;//此时区间为[mid+1...r]
}
else {//target < mid
r = mid-1; //此时区间为[l...mid-1]
}
}
return -1;
}
}
public class AlgorithmFir {
public static void main(String [] args){
int arr[] = {1,2,3,4,5,6,7,123,2342,15235214};
binarySearch tt = new binarySearch();
System.out.println("target:"+tt.binarySearch(arr,9,3));
}
}
int l = 0 , r = n-1;
对于这一行代码,如果我想要变化
int l = 0 , r = n;
那么,相应的函数应该变为
class binarySearch{
public int binarySearch(int arr[], int n, int target){
//[)为数学上的左开右闭区间的意思
int l = 0 , r = n;//在【l...r)的范围内寻找target
while( l < r ) {//当l == r的时候,区间【l..r)仍然是有效的
int mid = (l+r)/2;
if(target == mid)
return mid;
if(target > mid){
l = mid + 1;//此时区间为【mid+1...r)
}
else {//target < mid
r = mid; //此时区间为【l...mid)
}
}
return -1;
}
}
TIPS:
这里有一个不容易被发现的bug,这是我在华东师范大学复试题目发现的,题目非常简单,大概就是计算排列组合C几几的问题,但是会溢出,解决的办法同这里的类似。代码行为
int mid = (l+r)/2;
大数相加会出现溢出,所以我们可以采用相减
int mid = l+(r-l)/2;