

二分查找核心知识点梳理
一、算法原理
二分查找基于有序数组 的特性,利用「二段性」缩小目标范围:对于当前区间 [left, right],取中间位置 mid,通过比较 nums[mid]与目标值 target的大小,确定 target所在子区间,重复此过程直到找到目标或区间无效。
二、通用模板(朴素版)
以「左闭右闭区间 [left, right]」为例(区间内所有下标都有效),模板代码如下:
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1; // 右闭区间,初始右边界为数组长度-1
while (left <= right) { // 区间有效时持续缩小范围(left==right时仍需检查)
int mid = left + (right - left) / 2; // 防止(left+right)溢出的mid计算方式
if (nums[mid] < target) {
// target在右半段,调整左边界排除左半段
left = mid + 1;
} else if (nums[mid] > target) {
// target在左半段,调整右边界排除右半段
right = mid - 1;
} else {
// 找到目标,返回对应下标
return mid;
}
}
// 循环结束后仍未找到,返回-1
return -1;
}
三、关键细节解析
-
循环结束条件:
-
若采用「左闭右闭」区间(
right = nums.length - 1),循环条件为left <= right(保证left == right时仍检查中间元素)。 -
若采用「左闭右开」区间(
right = nums.length),循环条件为left < right(此时right初始越界,区间内有效下标为[left, right))。
-
-
mid 计算防溢出:
直接写
(left + right) / 2可能因left + right超过整数范围(如left和right极大时)导致溢出。改用left + (right - left) / 2可避免此问题。 -
边界调整逻辑:
-
当
nums[mid] < target时,target一定在mid右侧,因此左边界调整为mid + 1(排除mid及左侧元素)。 -
当
nums[mid] > target时,target一定在mid左侧,因此右边界调整为mid - 1(排除mid及右侧元素)。 -
若
nums[mid] == target,直接返回mid(已找到目标)。
-
四、示例演示(以有序数组查找为例)
假设数组 nums = [1, 3, 5, 7, 9],目标 target = 5:
- 初始
left=0, right=4,计算mid = 0 + (4-0)/2 = 2→nums[2]=5等于target,直接返回2。
若目标 target = 2:
-
第一轮:
left=0, right=4, mid=2→nums[2]=5 > 2→right=1(缩小到左半段[0,1])。 -
第二轮:
left=0, right=1, mid=0→nums[0]=1 < 2→left=1(缩小到右半段[1,1])。 -
第三轮:
left=1, right=1, mid=1→nums[1]=3 > 2→right=0(区间失效)。 -
循环结束(
left > right),返回-1。
通过以上步骤,可系统掌握二分查找的核心逻辑、代码实现及易错点,确保在有序数组查找场景中高效且正确地应用该算法。