美文网首页
二分搜索框架

二分搜索框架

作者: 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;
        }
    
    

    相关文章

      网友评论

          本文标题:二分搜索框架

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