码迷,mamicode.com
首页 > 编程语言 > 详细

算法学习——整数二分

时间:2020-01-27 09:41:19      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:names   image   bit   思路   png   拷贝   main   color   ace   

目前尚没有很彻底的理解,所以先将大佬的模板和思路拷贝下来,待理解透彻后再上自己的理解。

二分模板一共有两个,分别适用于不同情况。


算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。

版本1
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。

C++ 代码模板:

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;
}

 


版本2
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。

C++ 代码模板:

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;
}

 

例题:

技术图片

 

 

 题解代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6+10;

int a[N];
int n,m;

int main(){
    scanf("%d%d",&n,&m);
    for(int i = 0;i < n;i++)scanf("%d",&a[i]);
    while(m--){
        int x;
        scanf("%d",&x);
        int l = 0,r = n-1;
        while(l<r){
            int mid = l + r >> 1;
            if(a[mid] >= x) r =  mid;
            else l = mid + 1;
        }
        if(a[l] != x) printf("-1 -1\n");
        else{
            printf("%d ",l);
            int l = 0,r = n-1;
            while(l < r){
                int mid = l + r + 1 >> 1;
                if(a[mid] <= x) l = mid;
                else r = mid - 1;
            }
            printf("%d\n",l);
        }
    }

return 0;
}

 

 

算法学习——整数二分

标签:names   image   bit   思路   png   拷贝   main   color   ace   

原文地址:https://www.cnblogs.com/Flydoggie/p/12235385.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!