<p>二分查找的边界处理需明确搜索区间为左闭右闭[left, right]或左闭右开[left, right),前者while条件为left <= right,更新right = mid - 1;后者while条件为left < right,更新right = mid;两种方式均需在循环后判断目标是否存在。常见变体包括查找首个/末个等于目标值的元素、首个大于等于或最后一个小于等于目标值的元素,关键是在命中目标后不立即返回,而是继续收缩边界。尽管二分查找要求有序数组,但其分治思想可应用于非排序数组的快速选择和峰值查找等问题,通过调整策略实现高效搜索。</p>

二分查找是一种高效的搜索算法,它通过不断将搜索区间减半来快速定位目标值。关键在于确定正确的边界条件,以避免无限循环或错过目标值。
二分查找的核心在于理解和正确处理边界条件。
如何理解二分查找的边界?
二分查找的边界问题,说白了,就是确定
left
right
解决方案:
明确搜索区间: 始终明确
left
right
[left, right]
[left, right)
while
left
right
while
[left, right]
while (left <= right)
left
right
left
right
[left, right)
while (left < right)
left
right
left
right
left
right
[left, right]
nums[mid] < target
left = mid + 1;
nums[mid]
target
mid
left
mid + 1
nums[mid] > target
right = mid - 1;
nums[mid]
target
mid
right
mid - 1
[left, right)
nums[mid] < target
left = mid + 1;
nums[mid] > target
right = mid;
nums[mid]
target
right
right
mid
处理目标值不存在的情况: 在循环结束后,需要判断目标值是否存在。
[left, right]
left > right
[left, right)
left == right
代码示例 (左闭右闭):
public 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 {
right = mid - 1;
}
}
return -1; // 目标值不存在
}public int binarySearch(int[] nums, int target) {
int left = 0;
int right = nums.length; // 注意:right 初始化为 nums.length
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;
}
}
return -1; // 目标值不存在
}二分查找的常见变体有哪些?
二分查找不仅仅是查找一个确切的值,它还可以用于解决许多变体问题,例如:
查找第一个等于目标值的元素: 当数组中存在重复元素时,找到第一次出现目标值的索引。
查找最后一个等于目标值的元素: 类似地,找到最后一次出现目标值的索引。
查找第一个大于等于目标值的元素: 找到数组中第一个大于或等于目标值的元素的索引。
查找最后一个小于等于目标值的元素: 找到数组中最后一个小于或等于目标值的元素的索引。
这些变体问题的关键在于,在找到目标值后,不要立即返回,而是继续缩小搜索范围,直到找到满足特定条件的元素。例如,要查找第一个等于目标值的元素,当
nums[mid] == target
right
如何在非排序数组中使用二分查找的思想?
虽然二分查找本身要求数组必须是有序的,但其“分而治之”的思想可以应用于非排序数组中的某些问题,例如:
快速选择算法: 用于在无序数组中查找第 k 个最小(或最大)的元素。其核心思想是使用类似于快速排序的分区操作,每次将数组划分为两部分,并根据目标元素的位置选择继续在哪一部分进行搜索。
寻找峰值: 在无序数组中寻找峰值元素(大于其相邻元素的元素)。可以使用类似二分查找的方式,每次选择数组的中间元素,并根据其与相邻元素的大小关系,选择继续在哪一半进行搜索。
需要注意的是,这些算法虽然借鉴了二分查找的思想,但并不完全等同于二分查找,因为它们需要根据具体问题的特点进行调整和修改。
以上就是二分查找是什么?二分查找的边界条件的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号