关键技巧
每次缩小范围时一定要保持开闭特性不变,是左闭右开下一次遍历时还是要左闭右开,是左开右闭下一次还是要左开右闭。。。等等四种情况
举例
如果是左开右闭区间
对于数组nums
(left, right]
当没有找到目标即 nums[middle] != target 时①如果 target > nums[middle]
则执行 left = middle改变遍历区间, 因为left是左区间端点,因为是左开,显然middle已经不是我们要找的位置,所以是middle,这样就能保证左开了。②如果 target < nums[middle]
则执行 right = middle - 1, 因为middle已经被我们排除,而且我们要保证是右闭区间,所以是middle-1
总之一句话,保持开闭特性不变
终止循环条件
如果是双闭区间,就使用 while(left<=right), 否则 while(left<right)。
因为在前一条技巧中我们保证了开闭特性不变,如果有开区间当 left == right时就没有尝试的意义了,因为开区间端点的可能性已经在我们前一次的试探中排除了