二分法引申之分别取目标元素的最小索引和最大索引

本文介绍了如何使用二分法分别找到目标元素在数组中的最小索引和最大索引。在寻找最小索引时,通过将中间索引mid设定为(l+r)/2向下取整;而在寻找最大索引时,mid设定为(l+r+1)/2向上取整。伪代码和实际代码都已给出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为逻辑太过简单,所以省略不写只是要注意的是,取最小索引时,要让mid=(r+l)/2;意味着取left和right和除以2向下取整,取最大索引时,要让mid=(l+r+1)/2,意味着取left和right和除以2向上取整

取目标元素的最小索引

伪代码

left ← \leftarrow 1
right ← \leftarrow array.length
repeat
mid=(right+left)/2;
if array[mid]=right
then right=mid
else if array[mid]<target
then left=mid+1
else
right=mid-1
until l>=r
return left
}

代码

public  static int easyFunction(int[] st,int target){
    int l=0;
    int r=st.length-1;
    int mid=(r+l)/2;
    while (l<r){
        //FIXME:这里mid取的是下届。
        mid=(r+l)/2;
        if (st[mid]==target){
            r=mid;
        }else if (st[mid]<target){
            l=mid+1;}
   }else if (st[mid]>target){
    r=mid-1;
    }
    return l;
}

最大索引

伪代码

left ← \leftarrow 1
right ← \leftarrow array.length
repeat
mid=(right+left+1)/2;
if array[mid]=right
then left=mid
else if array[mid]<target
then left=mid+1
else
right=mid-1
until l>=r
return right

代码

  public  static int easyFunction(int[] st,int target){
    int l=0;
    int r=st.length-1;
    int mid;
    while (l<r){
        //FIXME:这里mid取的是下届。
        mid=(r+l+1)/2;
        if (st[mid]==target){
            l=mid;
        }else if (st[mid]<target){
            l=mid+1;}
        if (st[mid]>target){
            r=mid-1;
            ;}
    }
    return r;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值