基本思路就是设两端点指针,一次改变一个端点指针
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;
}