算法通关手册(九) 二分查找 模板 + 题目 + 题解

168 阅读1分钟

一、 二分查找

1. 基础模板

function binarySearch (arr, target) {
    let l = 0;
    let r = arr.length - 1;
    
    while (l <= r) {
        const mid = (l + r) >> 1;
        
        if (arr[mid] === target) return mid;
        
        if (arr[mid] < target) {
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    
    return -1;
};

题目

2. lower_bound模板(最小的符合条件的值)

寻找第一个大于等于target的数

function findMin (nums) {
    const target = ???;
    
    let l = 0;
    // 当结果为r的时候说明没有符合条件的
    let r = nums.length;
    
    while (l < r) {
        const mid = (l + r) >> 1;
        
        if (nums[mid] <= target) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    
    return r;
};

题目

3. upper_bound模板(最大的符合条件的值)

function findMax (nums) {
    const target = ???;
    // 结果 -1 则说明没有符合的答案
    let l = -1;
    let r = nums.length;
    
    while (l < r) {
        const mid = (l + r + 1) >> 1;
        
        if (nums[mid] <= target) {
            l = mid
        } else {
            r = mid - 1;
        }
    }
    
    return l;
};

题解

二、三分查找

简述

三分法可用于求单峰函数的极大值或单谷函数的极小值,也适用多峰函数的局部极大/极小值

lmid:左侧mid rmid: 右侧mid

如果 lmid < rmid 则最大值一定不在 lmid左侧 则可舍去左半部分。同理,如果lmid < rmid 则最大值一定不在 rmid 右侧,则可舍去右半部分

1.png

题目

三、 二分答案

简述

对mid值进行判断,舍弃一边

题目