二分查找模板全集
🔍 二分查找模板全集(Java 无歧义版)
✅ 模板一:查找最小满足条件的值(lower bound)
适用于:
在一个范围 [left, right]
中,找 最小的满足条件 的数。
模板:
int left = L, right = R;
while (left < right) {int mid = left + (right - left) / 2; // 中点靠左if (check(mid)) {right = mid; // mid 可能是答案,收缩右边界} else {left = mid + 1; // mid 不满足,排除左半部分}
}
return left; // left == right,为最小可行值
特点:
- 循环条件是
<
- 右边界始终不丢
- 适用于 “找最小可行值”
例子:
找最小的
x
,使得x^2 >= target
✅ 模板二:查找最大满足条件的值(upper bound)
适用于:
在一个范围 [left, right]
中,找 最大的满足条件 的数。
模板:
int left = L, right = R;
while (left < right) {int mid = left + (right - left + 1) / 2; // 中点靠右,避免死循环if (check(mid)) {left = mid; // mid 满足,尝试更大} else {right = mid - 1; // mid 不满足,排除右半部分}
}
return left; // left == right,为最大可行值
特点:
- 循环条件
<
- 左边界始终不丢
- 适用于 “找最大可行值”
例子:
找最大的
x
,使得x^2 <= target
✅ 模板三:查找目标元素(标准二分查找)
适用于:
在有序数组中,找 target
的索引。
模板:
int left = 0, right = nums.length - 1;
while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}
}
return -1; // 未找到
特点:
- 循环条件是
<=
- 精确查找目标
- 退出后
left
是插入位置(如果需要)
🧠 模板对比表
目标 | 循环条件 | mid计算方式 | 区间收缩 | 返回值 | 场景 |
---|---|---|---|---|---|
最小满足条件 | while (left < right) | mid = left + (right - left) / 2 | right = mid / left = mid + 1 | left | 二分答案题(如最小时间) |
最大满足条件 | while (left < right) | mid = left + (right - left + 1) / 2 | left = mid / right = mid - 1 | left | 找最大可行值 |
精确查找值 | while (left <= right) | mid = left + (right - left) / 2 | left = mid + 1 / right = mid - 1 | mid 或 -1 | 数组查找 |
📘 总结口诀(记忆法)
类型 | 口诀 |
---|---|
最小可行值 | while(left < right),右=mid,左=mid+1 |
最大可行值 | while(left < right),左=mid,右=mid-1,mid右取 |
精确查找值 | while(left <= right),三分支 |