YSMull
<-- home

如何进行二分查找

模板

想要知道数学推导,请参考[1]

// 搜索 nums 数组中 [begin, end)
// 如果要搜索数组中所有的位置,end 就取 nums.length
int binarySearch(int[] nums, int begin, int end) {
    int l = begin, r = end;
    while (l < r) {
        int mid = l + (r - l) / 2;
        // f 可把 nums 映射为单调非递减的 bool 数组,前 false 后 true
        if (f(nums, mid)) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    // 二分结束
    if (l == end) { // 没有搜到
        return -1;
    } else { // 搜到了
        // [begin, end) 中第一个满足 f(m) == true 的位置
        // 如果要返回最后一个为 false 的位置,则返回前 l - 1
        return l;
    }
}

参考资料