zoukankan      html  css  js  c++  java
  • 二分算法框架

      二分算法的前提是排序数组,通过折半查找的方式,将找到目标值的时间复杂度缩小到O(logn)

      最主要的3个问题

    • 查找某元素即返回索引
    • 查找某元素的左边界索引
    • 查找某元素的右边界索引

    二分算法框架:

    // 查找某元素即返回索引
    int binarySearch(int num[], int length, int target){
        if(length < 1)
            return -1;
        int left = 0;
        int right = length - 1;
        // 左右封闭
        while(left <= right){
            int middle = left + ((right - left) >> 1);
            if(num[middle] == target)
                return middle;
            else if(num[middle] > target)
                right = middle - 1;
            else if(num[middle] < target)
                left = middle + 1;
            // 全写else if,不写else,这样更好理解
        }
        // 找不到就直接返回
        return -1;
    }
    
    
    // 查找左边界
    int binaryLeftBound(int num[], int length, int target){
        if(length < 1)
            return -1;
        int left = 0;
        int right = length - 1;
        // 左右封闭法(注意也可以左闭右开)
        while(left <= right){
            int middle = left + ((right - left) >> 1);
            if(num[middle] == target)
                // 不着急返回,向左收缩范围
                right = middle - 1;
            else if(num[middle] > target)
                right = middle - 1;
            else if(num[middle] < target)
                left = middle + 1;
        }
        // left可能越界
        if(left >= length || num[left] != target)
            return -1;
        return left;
    }
    
    // 查找右边界
    int binaryRightBound(int num[], int length, int target){
        if(length < 1)
            return -1;
        int left = 0;
        int right = length - 1;
        // 左右封闭法(注意也可以左闭右开)
        while(left <= right){
            int middle = left + ((right - left) >> 1);
    
            if(num[middle] == target)
                // 不着急返回,向右收缩范围
                left = middle + 1;
            else if(num[middle] > target)
                right = middle - 1;
            else if(num[middle] < target)
                left = middle + 1;
        }
        if(right < 0 || num[right] != target)
            return -1;
        return right;
    }
    
  • 相关阅读:
    窗体控件随窗体大小改变(包括字体大小)
    Silverlight数据加载时,等待图标显示与隐藏(Loading)
    鼠标经过时,地图上的每个城市变颜色并且有提示框
    开始博客生活
    光纤
    静态路由配置(Static Routing)
    对称加密与非对称加密
    RIP Debug 过程
    WORD 固定表头自动生成/在Word表格接续页加上重复表格标题
    RIP路由
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13569417.html
Copyright © 2011-2022 走看看