不能用(left+right)/2形式,当left和right都是int,两个值的初始值都超过int限定大小的一半,那么left+right就会发生溢出,所以应该用left+(right-left)/2来防止求中值时候的溢出.

    二分查找的标准写法:(此写法还有一个好处,出循环后low = high-1 )如果目标值不存在于数组中,return low返回按顺序插入的位置(35.搜索插入位置结论)

    1. int search(int* nums, int numsSize, int target){
    2. int low = 0;
    3. int high = numsSize-1;
    4. while(low<=high){
    5. int mid = (high - low)/2 + low;//细节,防止数据溢出
    6. if(nums[mid] == target){
    7. return mid;
    8. }
    9. else if(nums[mid]>target){
    10. high = mid-1;
    11. }
    12. else
    13. low = mid+1;
    14. }
    15. return -1;
    16. }

    如果写了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 就可以取到了 (记得一定要带=号)