适用于数组为升序数组且数组中无重复元素的情况。
主要方法为每次对半砍数组,比较数组的中间值跟目标数的大小。
第一种方法:左闭右闭 [left,right]
指的是while(left<=right),判断语句中可以取等号,因为[left,right],两边都可以取,也就是说可以同时取到right和left。
第二种方法:左闭右开 [left,right)
同理,可取到left,取不到right,这时候的while(left<right),取不到等号。
两种不同的取法导致了在循环的进行中,right和left的取值问题。
左闭右闭时,对应的是middle-1和middle+1。
此时应该也能直接=middle,不过可能会导致超时,效率低,所以直接-1就好了。
左闭右开时对应的是right=middle,left=middle。
此时如果用right=middle-1会出错,因为假设target就在middle前一位,right=middle-1会直接到target的位置,此时下一个循环left=middle+1,一直加,加到最后left=right,因为判断条件为(left<right),所以不进入循环,导致算法出错。
而第一种方法可以+1 -1就是因为最后right=left时可以进入循环,可以正常输出下标。
int search(int* nums, int numsSize, int target)
{
int right=numsSize-1;
int left=0;
while(left<=right)
{
int mid=(right+left)/2;
if(nums[mid]>target)
{
right=mid-1;
}
else if(nums[mid]<target)
{
left=mid+1;
}
else
{
return mid;
}
}
return -1;
}