二分法
二分法(个人理解):就是在一组有序的数,判断额外的一个数是否在这组数字中,二分的意思就是通过不断将这一组数字对半分从而缩小搜索范围,判断每次对半的中间数比这个数大还是小,从而向上或者向下划分范围
例题:Leecode704,二分查找
原题链接
在此题中题设要求若找出此数则要返回下标,未找到返回-1,所以在对半切分过程切分的点是数组的下标,而不是过度关注数组的数,数组的数只需要在比较时候出现,处理好下标关系才更加重要,我第一次做的时候是关注在下标,但是我太细分了,关注到数组个数为奇数或者是偶数,其实没有关系,偶数÷2偶数或奇数(2÷2=1),奇数÷2为偶数或偶数(1÷2=0),太关注奇偶数分类就导致越分越细致,最后超时,还有可能漏掉一些情况,所以只需要关注下标范围的头尾位置,尤其在数组中+1,-1这些边边位置,下面放上代码,我尽量加上自己理解的注释
int search(int* nums, int numsSize, int target){
int low = 0;//最低处坐标
int high = numsSize-1;//最高处坐标=数组数量-1(数组下标从0开始)
int mid;//中间坐标
while(high>=low)
//将此设置结束标志,因为高处坐标小于低处坐标时,则说明整个数列都被切分过比较过还是没有找到
{
mid = (high-low)/2+low;
//要加上最低处坐标,如果不加最后除着除着就是0、1这样了,那如果最后剩两三个位于数组坐标高处呢?
if(target==nums[mid])
{
return mid;
}
if(target>nums[mid])//目标数比中间数高,最低处坐标上调,最高处坐标不变,整体范围在上方
{
low = mid+1;
}
if(target<nums[mid])//目标数比中间数低,最高处坐标下调,最高处坐标不变,整体范围在下方
{
high = mid-1;
}
}
return -1;
}