美文网首页
二分搜索框架

二分搜索框架

作者: yanlong107 | 来源:发表于2021-05-10 09:46 被阅读0次

注意事项

-搜索区间需要特别留意:[左开、右开] 还是 [左开、右闭)

  • while 终止 是否需要带 =号, 区间与 最开始确定的搜索区间

二分搜索框架

    int binarySearch(int num[], int target) {
        
        // 注意 二分搜索的区间是 [左开,右开]
        int left = 0;
        int right = num.length - 1;
        
        // 所以这里的终止条件是 left > right
        while (left <= right) {
            // (left + right ) / 2 和 left + ((right - left ) / 2) 结果相同
            // left 和 right 太大, (left + right ) / 2 可能溢出
            int mid = left + ((right - left ) / 2);
            if (mid == target) {
                return mid;
            } else if (mid > target) {
                right = mid - 1;
            } else if (mid < target) {
                left = mid + 1;
            }
        }
        
        return -1;
    }

左侧二分搜索边界

    int left_bound(int num[], int target) {
        
        // 注意 二分搜索的区间是 [左开,右开]
        int left = 0;
        int right = num.length - 1;
        
        // 所以这里的终止条件是 left > right
        while (left <= right) {
            // (left + right ) / 2 和 left + ((right - left ) / 2) 结果相同
            // left 和 right 太大, (left + right ) / 2 可能溢出
            int mid = left + ((right - left ) / 2);
            if (mid == target) {
                right = mid - 1;  // 找到后,不返回,收缩右侧边界,继续搜索
               // return mid;  
            } else if (mid > target) {
                right = mid - 1;
            } else if (mid < target) {
                left = mid + 1;
            }
        }
        if (left >= num.length || num[left] != target) {
                return -1;
        } 
        return left;
    }

右侧二分搜索边界

    int right_bound(int num[], int target) {
        
        // 注意 二分搜索的区间是 [左开,右开]
        int left = 0;
        int right = num.length - 1;
        
        // 所以这里的终止条件是 left > right
        while (left <= right) {
            // (left + right ) / 2 和 left + ((right - left ) / 2) 结果相同
            // left 和 right 太大, (left + right ) / 2 可能溢出
            int mid = left + ((right - left ) / 2);
            if (mid == target) {
                left = mid + 1;  // 找到后,不返回,收缩左侧边界,继续搜索
               // return mid;  
            } else if (mid > target) {
                right = mid - 1;
            } else if (mid < target) {
                left = mid + 1;
            }
        }
        if (right < 0 || num[right] != target) {
                return -1;
        } 
        return right;
    }

相关文章

  • 二分搜索框架

    注意事项 -搜索区间需要特别留意:[左开、右开] 还是 [左开、右闭) while 终止 是否需要带 =号, 区间...

  • Algorithm进阶计划 -- 二分搜索

    二分搜索二分搜索模板二分搜索运用 1. 二分搜索模板 二分搜索(二分查找)也称折半查找(Binary Search...

  • 算法-二分搜索算法

    算法:二分搜索算法(折半查找算法)时间复杂度: 二分搜索算法概述 二分搜索算法伪代码 二分搜索算法实现 二分搜索算...

  • 搜索算法

    顺序搜索 二分搜索

  • 二分搜索(Binary_Search)

    1. 二分搜索是什么? 二分搜索(英语:binary search),也叫折半搜索(英语:half-interva...

  • 彻底搞懂二分查找

    1.简介 二分查找即搜索一个数,如果存在,返回其索引,否则返回 -1。基本框架: 分析二分查找的一个技巧是:不要出...

  • AVL 树

    一:什么是 AVL 树? 在我的上一篇文章《二分搜索树与二分查找法》中,详细介绍了二分搜索树这种数据结构。二分搜索...

  • 二分算法-LeetCode 69

    二分算法-LeetCode 69 二分算法 二分算法模板, 二分搜索即搜索一个数,如果存在,返回其索引,否则返回-...

  • Pearls9. 代码调优

    [TOC] 问题:在包含1000个整数的表中进行二分搜索: 二分搜索的调优 说明:在二分搜索中通常不需要代码调优 ...

  • Pearls4 编写正确的程序

    4.1 二分搜索

网友评论

      本文标题:二分搜索框架

      本文链接:https://www.haomeiwen.com/subject/wgvbdltx.html