不能用(left+right)/2形式,当left和right都是int,两个值的初始值都超过int限定大小的一半,那么left+right就会发生溢出,所以应该用left+(right-left)/2来防止求中值时候的溢出.
二分查找的标准写法:(此写法还有一个好处,出循环后low = high-1 )如果目标值不存在于数组中,return low返回按顺序插入的位置(35.搜索插入位置结论)
int search(int* nums, int numsSize, int target){
int low = 0;
int high = numsSize-1;
while(low<=high){
int mid = (high - low)/2 + low;//细节,防止数据溢出
if(nums[mid] == target){
return mid;
}
else if(nums[mid]>target){
high = mid-1;
}
else
low = mid+1;
}
return -1;
}
如果写了low=mid+1;high=mid-1;就要可以取到low和high,用low<=high就可以了
一些双循环的题目可以用二分查找优化一下( O(n^2)->O(n*logn) )
不过前提是数组是有序的(数组必须有序)!!!
注意:
high = mid - 1, low = mid + 1关键在于是否能取到low和high
让 low <= high 就可以取到了 (记得一定要带=号)