LeetCode:704

![[Pasted image 20261028100913.png]]

前提:

  1. 数组为有序数组
  2. 数组中无重复元素

注意:

  1. 二分查找涉及很多边界条件
  2. 要想清楚对区间的定义,区间定义就是不变量
  3. 二分查找过程中,保持不变量,遵守循环不变量规则
  4. 区间定义分为两种:左闭右闭或左闭右开

**第一种区间:

定义target在[left, right]区间,有如下两点:**

  1. while(left <= right), 要使用 <= ,因为left == right是有意义的,所以使用 <=
  2. if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
    ![[Pasted image 20261028104538.png]]

第二种区间:

定义target在[left,right)]区间,有如下两点:

  1. while (left < right),这里使用 < ,因为left == right在区间[left, right)]是没有意义的
  2. if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
    ![[Pasted image 20261028105230.png]]

总结:

区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。