二分搜索大家都会,但是一般我们都是采用闭区间[a,b]的方式来进行搜索,并且循环条件一般是left <= right。但是这种方式需要考虑的边界条件比较多,这里推荐二分搜索最好采用半开区间[a,b)判断的方式,也就是说如果数组大小为n,那初始的left设为0,right设为n。以下代码足够简洁,并且可以返回第一个大于等于target的数的index:
private int binarySearch(int[] arr, int target) {
int left = 0, right = arr.length; // 注意这个初始right设为数组长度
while (left < right) {
// 推荐采用这种方式取mid,而不是 mid = (left + right) / 2,因为后者可能会导致溢出
int mid = left + (right - left)/2;
if (arr[mid] < target)
left = mid+1;
else right = mid;
}
return left; // 这里不需要考虑返回left还是right,因为最终left总是等于right
}
网友评论