这里用了左闭右开的写法
public static int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
int middle = 0;
while (left < right) {
middle = (left + right) / 2;
if (nums[middle] == target) {
return middle;
}
if (nums[middle] < target) {
left = middle + 1;
}
if (nums[middle] > target) {
right = middle;
}
}
return -1;
}
看上去很简单的题,但是有很多需要注意的细节
- 首先要确定是左闭右开写法还是左闭右闭写法,确定写法之后就可以更容易考虑边界问题
- 定义right的时候,因为是左闭右开写法,所以right = nums.length,因为right这个值是取不到的
- 对于middle变量,需要在while循环中单独拿出来计算,而不能在if 语句当中计算。因为可能会出现当第二个if语句满足条件,middle这时候会被重新计算一遍,然后到了第三个if条件的时候,nums[middle] > target 中的middle是刚刚被重新计算的middle,所以可能会出现数组越界的情况。
- 第二个if中,被重新计算后的left是在区间范围内的(左闭右开),所以left需要+1(middle在上一次循环已经被验证过了,所以不能出现在下一次循环)
- 第三个if中,被重新计算后的right不在区间范围内,所以right = middle并不会让下一次循环取到right值