二分算法核心思路
在处理有序数据或具有单调性的问题时,二分查找往往能将时间复杂度从 O(N) 降低到 O(log N)。它的核心在于利用数据的'二段性'——即数组可以被某个条件划分为两部分,一部分满足性质,另一部分不满足。通过不断缩小搜索范围,我们就能快速定位目标。
基础:二分查找
最经典的场景是在一个升序数组中查找目标值。如果找到返回下标,找不到则返回 -1。

实现时需要注意边界条件和中间值的计算方式。使用 left + (right - left) / 2 可以避免整数溢出问题。循环终止条件通常是 left <= right,确保不会漏掉最后一个元素。
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (target > nums[mid]) {
left = mid + 1;
} else if (target < nums[mid]) {
right = mid - 1;
} else {
return mid;
}
}
return -1;
}
}
复杂度分析: 时间复杂度为 O(log N),空间复杂度为 O(1)。
变体:查找元素的第一个和最后一个位置
当数组中存在重复元素时,我们需要找到目标值出现的起始和结束索引。这可以通过两次二分查找来实现:一次找左边界,一次找右边界。



