生活中的二分查找是什么呢?比如你想查找英文单词 Binary 是什么意思,拿出一本普通的英文词典,从中间一分为二。看到的是字母 M 开头的单词,比如 Myself。这个时候你知道翻过头了,于是在封面和 Myself 之间一分为二。看到的是 E 开头的单词,比如 End。还是过头了,Binary 肯定在封面和 End 之间。
二分查找就是这样的,数组是有序的和字典按字母排列一样,每次二分之后用目标值和中间值进行对比,如果目标值的比较结果是在中间值之前就用中间值作为新的终点值,如果在中间值之后就用原来的中间值作为新的起始值。
class Solution {
public int search(int[] nums, int target) {
int start = 0, end = nums.length - 1;
int mid = nums.length / 2;
while (start <= end) {
if (target == nums[mid]) {
return mid;
} else if (target < nums[mid]) {
end = mid - 1;
} else {
start = mid + 1;
}
mid = (start + end) / 2;
}
return -1;
}
}
这里面有两个需要注意的地方,一个是比较的条件要包含起始值等于终点值的情况,以免漏掉原本包含的目标值;第二个需要注意的地方是每次对比之后中间值要根据情况分别做 +1 或者 -1 的操作,否则可能会陷入死循环。