二分查找算法思路如下:确定要查找的数组nums的左下标left,右下标right。根据left,right计算出中间下标mid。比较nums[mid]和target值,再根据比较的情况,重新确定要查找的数组的边界。即重复上述步骤。直到找到想要找的数,或者没找到(循环退出)。JAVA代码如下:
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
}
}
return -1;
}
代码的关键在于三个细节
- 循环判断的条件是left <= right,而不是left < right,为什么呢? 就想数组只有一个数的情况。这种写法意味着在循环体中就能找到答案。而left < right有可能需要跳出循环体后才找到答案。
- 中间下标 mid = left + (right - left) / 2, 而不是 mid = (left + right) / 2。这样写可以防止整数溢出,这个问题在我另一篇blog中有记载 贴个连接
- left = mid + 1,right = mid - 1