打卡第1天:二分法查找有序数组

 适用于数组为升序数组且数组中无重复元素的情况。

主要方法为每次对半砍数组,比较数组的中间值跟目标数的大小。

第一种方法:左闭右闭  [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;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值