二分查找算法实战
二分查找是面试和竞赛中的高频考点。它不仅仅是一个简单的 while 循环,核心在于理解数据的单调性或二段性。只要数组满足特定条件(如有序、单峰、旋转后局部有序),就能通过折半策略将时间复杂度从 O(N) 降至 O(log N)。
下面我们通过八道经典 LeetCode 题目,由浅入深地梳理 Java 实现细节。
1. 基础二分查找
题目描述:在升序数组中查找目标值,存在返回下标,否则返回 -1。
思路解析:这是最标准的模板。关键在于维护左右边界 left 和 right。为了防止 (left + right) 溢出,计算中间值时推荐使用 left + (right - left) / 2。当 target 大于中间值时,说明目标在右半部分;反之在左半部分。
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 (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
}
注意:这里使用
left <= right是因为区间是闭区间[left, right],当left == right时仍需检查该位置。
2. 在排序数组中查找元素的第一个和最后一个位置
:找到目标值在数组中的起始和结束索引,若不存在返回 。


