zoukankan      html  css  js  c++  java
  • 二分查找及其变种

    要点

    1. 每次查找范围一定要缩小,如果另mid = l 或 mid = r时,查找范围为长度为1时会陷入死循环。
    2. 如果写成 l < r , 当查找范围长度为1时,会导致找不到key。
    3. 写成mid = l + (r - l)/2,可防止整数溢出。
    4. 使用ans保存已经符合条件的最后的mid,最后返回即可。

    查找符合条件的位置

    int binary(int * arr, int val, int l, int r)
    {
        if(arr == NULL || r < 0) return -1;
        int mid = 0;
        while(l <= r)
        {
            mid = l + (r - l)/2;
            if(arr[mid] == val)
            {
                return mid;
            }
            else if(arr[mid] > val)
            {
                r = mid - 1;
            }
            else
            {
                l = mid + 1;
            }
        }
        return -1;
    }
    

    查找符合要求的最小位置

    int binary(int * arr, int val, int l, int r)
    {
        if(arr == NULL || r < 0) return -1;
        int mid = 0;
        int ans = -1;
        while( l <= r )
        {
            mid = l + (r - l)/2;
            if(arr[mid] >= val)
            {
                ans = mid;
                r = mid - 1;
            }
            else
            {
                l = mid + 1;
            }
        }
        return ans;
    }
    

    查找符合要求的最大的位置

    int binary(int * arr, int val, int l, int r)
    {
        if(arr == NULL || r < 0) return -1;
        int mid = 0;
        int ans = -1;
        while(l <= r)
        {
            mid = l + (r - l)/2;
            if(arr[mid] <= val)
            {
                ans = mid;
                l = mid + 1;
            }
            else
            {
                r = mid - 1;
            }
        }
        return ans;
    }
    
  • 相关阅读:
    permute
    ind2sub
    randi( )函数--MATLAB
    ABAQUS复合材料
    matlab中fix函数,floor函数,ceil函数
    在windows10中卸载软件和取消开机启动程序
    在linux的tomcat中配置https及自动跳转
    解决ubuntu无法远程连接
    谷歌浏览器 插件安装配置Momentum chrome
    0903——元类
  • 原文地址:https://www.cnblogs.com/jostree/p/5249561.html
Copyright © 2011-2022 走看看