关于二分法的边界感悟-java实现

来源:互联网 发布:淘宝代付 编辑:程序博客网 时间:2024/06/08 15:23

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;
原创粉丝点击