二分模板

136 阅读1分钟

概念

  1. 左指针到右指针能取到的值表示搜索范围
  2. 加减法比位移优先级高
  3. mid用防溢出写法,加法改成减法
  4. 根据开区间写法,满足条件时 l == r

模板一

寻找左边界

while (l < r) {
    int mid = r - (r - l + 1 >> 1);
    if (满足要求) {
        r = mid; // 往左找
    } else {
        l = mid + 1; // 不满足
    }
}
return l;

模板二

寻找右边界

while (l < r) {
    int mid = r - (r - l >> 1);
    if (满足要求) {
        l = mid;
    } else {
        r = mid - 1;
    }
}
return l; // 注意检查l是否满足要求,还是仅仅是跳出循环了。

可直接解决的题目(模板题)

  1. 35. 搜索插入位置 - 力扣(Leetcode)
  2. leetcode.cn/problems/fi…
  3. leetcode.cn/problems/sq…

旋转数组

leetcode.cn/problems/se… leetcode.cn/problems/fi…

峰值

leetcode.cn/problems/fi…

多次二分

leetcode.cn/problems/se…

利用二分性在答案的范围内搜索

LCP 12. 小张刷题计划 - 力扣(Leetcode)