1. 二分查找核心思想
二分查找是一种高效的查找算法,适用于 已排序的数组。
核心逻辑:
-
每次比较数组中间元素与目标值。
-
如果中间元素等于目标,直接返回索引。
-
如果目标值更小,在左半部分继续查找;否则在右半部分查找。
-
重复直到找到目标或区间缩小为空。
特点:
-
时间复杂度
O(log n)
,远超线性搜索的O(n)
-
要求数据必须有序(升序或降序)
2. Java代码实现
基础版(左闭右闭区间)
代码如下:
public int binarySearch(int[] nums, int target) {
int left = 0, right = nums.length - 1; // 闭区间 [left, right]
while (left <= right) { // 注意:<= 因为区间内可能只剩一个元素
int mid = left + (right - left) / 2; // 避免溢出,等同于 (left + right)/2
if (nums[mid] == target) {
return mid; // 找到目标
} else if (nums[mid] < target) {
left = mid + 1; // 目标在右半部分
} else {
right = mid - 1; // 目标在左半部分
}
}
return -1; // 未找到
}
递归版
public int binarySearchRecursive(int[] nums, int target, int left, int right) {
if (left > right) return -1;
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
return binarySearchRecursive(nums, target, mid + 1, right);
} else {
return binarySearchRecursive(nums, target, left, mid - 1);
}
}
总结
-
核心思想:通过不断缩小搜索区间快速定位目标。
-
前提条件:数据必须有序(否则需先排序,代价
O(n log n)
)。 -
适用场景:静态数据集(无频繁插入/删除)。