算法入门——二分法

二分法

二分法(个人理解):就是在一组有序的数,判断额外的一个数是否在这组数字中,二分的意思就是通过不断将这一组数字对半分从而缩小搜索范围,判断每次对半的中间数比这个数大还是小,从而向上或者向下划分范围
例题: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;
}

通过记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值