基本思路就是设两端点指针,一次改变一个端点指针

int search(int* nums, int numsSize, int target){

    int mid;
    int start=0, end=numsSize-1;

    while(start <= end)
    {
        mid = (start+end)/2;
        if(target == nums[mid])
            return mid;
        else
        {
            if(target < nums[mid])
                end = mid-1;
            else
                start = mid+1;
        }
    }
    return -1;
}

根据需求,改变端点指针的时候可以不进行减一或加一,来达到在下一次判断包含中点值的目的

// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
// 目标:找到坏版本号,所以错误的版本之后的所有版本都是错的,之前的都是正确的

int firstBadVersion(int n) {
    int m;
    int s=1,e=n;
    while(s < e)//去除等号,使s=e时为退出条件
    {
        m=s+(e-s)/2;
        if(isBadVersion(m))
            e=m;
        else
            s=m+1;
    }
    return s;
}

二分的中点的落点只有两种情况:

n为奇数时:落点为正中点

n为偶数时:落点为前半段

如果未找到目标值,中点的最终落点也只有两个情况:

1.落在目标值左侧(需要加1成为插入点)

2.落在目标值右侧(插入点)

所以根据这个结论可以加一个条件找到目标值插入点

int searchInsert(int* nums, int numsSize, int target){
    int mid;
    int start=0, end=numsSize-1;

    while(start <= end)
    {
        mid = (start+end)/2;
        if(target == nums[mid])
            return mid;
        else
        {
            if(target < nums[mid])
                end = mid-1;
            else
                start = mid+1;
        }
    }
    if(target > nums[mid])//插入点判断
        mid +=1;
    return mid;
}
最后修改:2022 年 05 月 25 日
如果觉得我的文章对你有用,请随意赞赏