二分查找/二分答案个人学习总结

114 阅读2分钟

感悟

最近在力扣上跟着灵神以及英雄哥的题集刷了二分查找的题目,不过大部分都是中等,困难的只做了少数几道,另外二分图也尚未接触,总结一下自己的思考以及感悟。

思路

首先,二分查找最重要的是了解数组的单调性,若是数组具有单调性那么可以二分,不具有单调性的话有可能可以二分,单调性即当满足该条件时,>= r的区间都会满足/不满足该条件,[例如](875. 爱吃香蕉的珂珂 - 力扣(LeetCode))中,当实际时间大于题目中所给的时间,那么大于实际时间的所有h都无法满足题目条件,而当实际时间可以满足题目条件时,<=实际时间的所有h都可以满足题目条件,这就是单调性。随后我们就需要找到循环不变量,有可能是题目中的中间条件,在该题中很明显便是题目给的条件h,无论我们进行什么操作其都不会发生改变。另外,如果遇到最小化最大值以及最大化最小值的题目大概率是二分。

模板

个人采用的语言是c++,二分的模板更喜欢开区间写法 首先,确定上下界lr

while(r-l > 1){
    int mid = l + (r-l) / 2; // 防止溢出
    if(check(mid)){
        r = mid;
    }else{
        l = mid;
    }
return r;

以上代码中的check函数是用来判断mid是否满足条件,随后可根据其结果更改区间 同时在我的刷题过程中遇到一些常用函数如下:

  1. ranges::lower_bound()返回区间中第一个大于等于目标值的迭代器。
  2. ranges::upper_bound()返回区间中第一个大于目标值的迭代器。
  3. ranges::min()找到区间中最小值
  4. ranges::*max_element()返回区间中最大值

总结

目前在数组中遇到的二分综上所述,有更多优质思路欢迎讨论与指正,建议先掌握模板后再使用lower_bound以及upper_bound节省时间,欢迎各位交流~~~