https://leetcode.com/problems/binary-search/
二分查找,没啥好说的,就是一个left,一个right,和一个pivot去判断当前的target是在哪个范围内。值得注意的是取平均数pivot = (left + right) / 2,这句如果left + right有可能会溢出(超过int所能表示的最大值)。那么可以改成left + (right - left) / 2,或者(left + right) >>> 1。
至于left + (right - left) / 2为什么可以保证不溢出,这里有推导过程:
根据定义,left < right。
结果是right - left > 0和left + (right - left) = right(遵循基本代数)。
因此是left + (right - left) / 2 <= right。因此,由于操作的每个步骤都受right的值限制,因此不会发生溢出。
相比之下,考虑原表达式(left + right) / 2。 left + right >= right,并且由于我们不知道left和right的值,因此该值很可能溢出。
public int search(int[] nums, int target) {
int pivot;
int left = 0;
int right = nums.length - 1;
while (left <= right) {
pivot = (left + right) / 2; // 改行可能有bug,使用 left + (right - left) / 2 或者 (left + right) >>> 1
if (nums[pivot] == target) return pivot;
else if (nums[pivot] < target) left = pivot + 1;
else right = pivot - 1;
}
return -1;
}