本题关键条件:
- 有序数组
- 无重复元素
因此,可以很快确定使用二分法。本题逻辑简单,但有一处地方需要注意,到底是:while(left < right)
还是 while(left <= right)
,到底是 right = middle
呢,还是要 right = middle-1
呢?
这取决于我们 left 指针和 right 指针的区间范围
- 如果是左闭右开 [left, right),那么 left < right;
- 如果是左闭右闭 [left, right],那么 left <= right;
举一个例子:数组 nums = [-1, 0, 3, 5, 11, 12, 13];就能够明白为什么了
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1; // 左闭右闭
int mid = -1;
while(left <= right) {
// mid = right - (right - left) / 2; // 这样写是有问题的
mid = left + (right - left) / 2;
if(nums[mid] < target) {
left = mid + 1;
} else if(nums[mid] > target) {
right = mid - 1;
} else if(nums[mid] == target) {
return mid;
}
}
return -1;
}
}