二分查找算法详解(附代码)

二分查找算法详解(附代码)

注:

现有一个升序 不重复的数组 查询target是否在此数组中并返回序号

使用条件

使用二分算法的两个条件:

  • 有序
  • 不重复

混淆处

二分算法两种方式容易弄混淆的地方:就是对区间的定义

  • 左闭右闭区间 [left,right]
  • 左闭右开区间 [left,right)

也就是在写while (left < right) 语句时 不清楚中间的判断符号咋写 是< 还是 <=

还有在循环中的if (nums[mid] > target) {right = mid;}语句中 符号的判断段 还有right = mid 还是right = mid-1

mid代表数组的中间序号 target是你查询的目标值

左闭右闭

先说第一种写法;左闭右闭

左闭右闭就是对区间的判断 可以取到两边的值 [left,right]

在取值的时候右边要取到数组长度-1 的值 int right = nums.length - 1;

写while 时,就多一种 left=right 的可能 所以需要用 <= 来确定

if语句判断 :if (nums[mid] > target) {right = mid-1;} 因为你可以取到 right的值而且时候判断出mid的值不是我们想要的,是比我们目标值大,所以要动右区间把最右边的值取到mid-1处;

代码如下:

int left = 0;
int right = nums.length - 1;
while (left <= right) {
    int mid =  left + ((right - left) / 2);
    if (nums[mid] > target) {
        right = mid - 1;
    } else if (nums[mid] < target) {
        left = mid + 1;
    } else if (nums[mid] == target){
        return mid;
    }
}
return -1;

左闭右开区

左边的不变 主要是右边发生变化

右边的值现在取不到 int right = nums.length ;

while语句就没有left=right 的可能性

if语句:if (nums[mid] > target) {right = mid;} 因为right是取不到的 所以 mid=right是有意义的

代码如下:

nt left = 0;
int right = nums.length;
while (left < right) {
    int mid =  left + ((right - left) / 2);
    if (nums[mid] > target) {
        right = mid;
    } else if (nums[mid] < target) {
        left = mid+1;
    } else if (nums[mid] == target) {
        return mid;
    }
}
return -1;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值