zoukankan      html  css  js  c++  java
  • 二分(搜索)查找

     以为二分查找和二分搜索是两个不同的东西,但是代码咋个又这么像嘞,思路咋个都是一个的嘞,傻傻没分清楚过。

    区别在于对 lb 和 ub 进行赋值的时候,一个赋的是:lb=0,ub=n-1;一个赋的是:lb= -1,ub=n;因此导致对 mid 进行更新时,一个要mid+1 或者 mid-1,一个可以直接赋值mid;一个循环条件是:ub-lb>=0,一个循环条件是:ub-lb>1;

    总之,(L,R) ——> R-L>1

    [L,R)——> R-L>0

    (L,R]——> R-L>0

    [L,R]——>R-L>=0

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    int a[100];
    void binarySerach(int n, int k) {//适用于无重复数
        int lb = 0;
        int ub = n-1;
        // 这里必须是 <=
        while (lb <= ub) {
            int mid = (lb + ub) / 2;
            if (a[mid] == k) {
                printf("%d
    ",mid);
                return;
            }
            else if (a[mid] < k) {
                lb = mid + 1;
            }
            else {
                ub = mid - 1;
            }
        }
        printf("%d
    ",n);
    }
    void solve(int n,int k)//适用于有重复数
    {
        int lb=-1,ub=n;
        while(ub-lb>1)
        {
            int mid = (ub+lb)/2;
            if(a[mid]>=k)
                ub=mid;
            else
                lb=mid;
        }
        printf("%d
    ",ub);
    }
    int main()
    {
        int n,k;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        scanf("%d",&k);
        sort(a,a+n);
        solve(n,k);
        //binarySerach(n,k);
        return 0;
    }
    
  • 相关阅读:
    马拉车算法
    E. You 题解(思维)
    马拉车练习2
    The Boomsday Project 题解(玄学dp)
    Journey to Un'Goro 题解(思维+剪枝搜索)
    Black and white 题解(思维+prim)
    Rise in Price 题解(dp+随机数据)
    高斯消元
    马拉车练习1
    概率期望问题
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160190.html
Copyright © 2011-2022 走看看