Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky -------Knuth
尽管二分查找的基本理念十分简单明了,但是它的细节queue令人抓狂 ----唐纳德·克努特(KMP发明者)
能不能写对二分查找有以下几个关键点:
-
初始边界值
-
循环条件
-
左侧、右侧如何更新
-
中间点位置选取
严格的统计来讲,二分查找有64种写法,但是重要的是我们能写对其中一种。
tips :写对二分的技巧是不要用else,而是把每一种情况列出来
下面举例三种常用二分:
1.标准二分
public int binarySearch(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;