二分法模板
时间: 2025-03-29 17:05:15 浏览: 24
### 二分法算法模板与实现示例
以下是基于提供的参考资料所整理的二分法算法模板及其具体实现方式。
#### 模板一:标准闭区间 `[left, right]`
此模板适用于目标值可能存在于数组中的情况。初始条件设置为 `left = 0` 和 `right = nums.length - 1`,循环终止条件为 `while (left <= right)`[^1]。
```java
int binarySearch(int[] nums, int target) {
int left = 0;
int 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 if (nums[mid] > target) {
right = mid - 1; // 调整右边界
}
}
return -1; // 如果未找到目标值则返回-1
}
```
上述代码展示了如何通过调整左右指针逐步缩小搜索范围来定位目标值的位置[^2]。
---
#### 模板二:开区间 `(left, right]`
当需要处理某些特殊场景时(如寻找第一个大于等于某个数的位置),可以采用另一种变体形式——开区间的写法。此时初始化参数应设为 `left = -1`, `right = nums.length` 并修改相应的更新逻辑以及退出判断依据。
```python
def binary_search_left_bound(nums, target):
left, right = 0, len(nums)
while left < right:
mid = left + (right - left) // 2
if nums[mid] >= target:
right = mid # 改动点在此处
else:
left = mid + 1
if left != len(nums) and nums[left] == target:
return left # 返回最左侧匹配位置
return -1 # 若无匹配项,则返回-1表示失败
```
这里的关键在于每次迭代都将满足条件的部分保留下来继续考察直到最终收敛于单一点位为止。
---
#### 关键细节解析
对于为何会出现诸如 `right=mid` 这样的操作组合问题,在实际编码过程中确实容易引发困惑。这是因为当我们决定舍弃某一半区域的同时也要确保不会遗漏潜在解所在之处的缘故所致。因此只有配合恰当的比较运算符才能正确完成整个过程而不至于陷入死循环或者错过答案的情况发生。
另外值得注意的一点就是关于中间节点计算方法的选择上也存在细微差异影响性能表现等方面考量因素的存在。
---
阅读全文
相关推荐


















