二分法总结

(本篇为我的一次正式的博客,还有很多写的不好的地方请海涵)
1(在一个有序的数组找查某个元素)
 int binarySearch(int[] nums, int target) {
    int left = 0;
    int right = nums.length-1;
    while(left <= right) { //注意符号/*这样写有可能发生溢出的状态建议写为 mid=left+(right-left)>>1;
        int mid = (right + left) / 2;        if(nums[mid] == target)
            return mid;
        else if (nums[mid] < target)
            left = mid + 1; // 注意
        else if (nums[mid] > target)
            right = mid - 1; // 注意
        }
    return -1;}
123456789101112
2如果有多个元素重复出现查找它的位置
1寻找下界
 int lower_bound(int l, int r){    while (l < r)    {       
 int mid =( l + r) >> 1;     
   if (a[mid]>=y)
   { r = mid;   
       else l = mid + 1;    }   
       return l;}12345
2寻找上界
 `int upper_bound(int l, int r)
{    while (l < r)
   {        int mid = (l + r ) >> 1;       
   if (a[mid]<=y) l = mid+1;  
        else r = mid ;    }
        return l;}`12345
关键在于理解这2段操作,其实很简单。取极限情况,考察相等的情况,看相等的值可不可能是解即可。
1可取则不加1;
2不可取则加1;
练习题:hdu Can you find it?
4非单调数组(连续的数)中的查找(函数中的2分查找)//我认为最简单的一种,关键就是要注意精度
   while(r-l>=eps) 
         {            mid = (l+r)/2;
                    if(fx(mid)<V)    
                               l = mid;    
                    else       r = mid; }
12345
练习题:hdu  Strange fuction*
5一个数据能把一段数据切分为2种状态的情况,例如大于或等于18岁为成年人,小于18岁就为未成年,18这个数据把人类的年龄这一段数据切分为了2种状态。
2种板子
 int bsearch_1(int l, int r){
     while (l < r)   
     {     int mid = l + r >> 1;  
          if (check(mid)) r = mid; 
                else l = mid + 1;    }
                   return l;}
 int bsearch_2( int l, int r)
 {    while (l < r) 
   {        int mid =( l + r + 1) >> 1;。//避免陷入死循环 
         if (check(mid)) l = mid;       
         else r = mid - 1;    }
            return l;}
 123456789101112
同样也是考察极限状况,要记住mid的不同取值。
练习题:hdu Cable master,    Pie ;
总的来说2分法较为简单,注意+1于-1,注意精度,就能ac;

posted @ 2019-12-09 10:26  炸了炸了  阅读(179)  评论(0)    收藏  举报