二分查找
更新于 2026-10-28 15:26
LeetCode:704
![[Pasted image 20261028100913.png]]
前提:
- 数组为有序数组
- 数组中无重复元素
注意:
- 二分查找涉及很多边界条件
- 要想清楚对区间的定义,区间定义就是不变量
- 二分查找过程中,保持不变量,遵守循环不变量规则
- 区间定义分为两种:左闭右闭或左闭右开
**第一种区间:
定义target在[left, right]区间,有如下两点:**
- while(left <= right), 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
![[Pasted image 20261028104538.png]]
第二种区间:
定义target在[left,right)]区间,有如下两点:
- while (left < right),这里使用 < ,因为left == right在区间[left, right)]是没有意义的
- if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
![[Pasted image 20261028105230.png]]
总结:
区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。