欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二分个人看法(供参考)

程序员文章站 2024-03-20 16:31:10
...

1.普通二分(无重复值)

[L,R]

#include <iostream>


using namespace std;
int arr[150],n;
int erfen(int target)
{
    int l=0,mid;
    int r=n-1;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(arr[mid]==target)
        {
            return mid;
        }
        else if(arr[mid]<target)
        {
            l=mid+1;
        }
        else if(arr[mid]>target)
            r=mid-1;
    }
    if(l>=n||l<0)
        return -1;
    else if(arr[l]==target)
    {
        return l;
    }
    else return -1;
}

int main()
{
    int target;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    scanf("%d",&target);
    int ans=erfen(target);
    printf("%d",ans);
    return 0;
}

2.取重复值最左侧

[L,R)

因为取最左侧,所以当arr[mid]=target,从[l,r)找目标值,所以r=mid。

所以代码是

#include <iostream>


using namespace std;
int arr[150],n;
int erfen(int target)
{
    int l=0,mid;
    int r=n;
    while(l<r)
    {
        mid=(l+r)/2;
        if(arr[mid]==target)
        {
            r=mid;
        }
        else if(arr[mid]<target)
        {
            l=mid+1;
        }
        else if(arr[mid]>target)
            r=mid
    }
    if(l>=n||l<0)
        return -1;
    else if(arr[l]==target)
    {
        return l;
    }
    else return -1;
}

int main()
{
    int target;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    scanf("%d",&target);
    int ans=erfen(target);
    printf("%d",ans);
    return 0;
}

3.取最右侧

[L,R)

因为取最右侧,所以当arr[mid]=target,从[l,r)找目标值,所以l=l+1;

代码

#include <iostream>


using namespace std;
int arr[150],n;
int erfen(int target)
{
    int l=0,mid;
    int r=n;
    while(l<r)
    {
        mid=(l+r)/2;
        if(arr[mid]==target)
        {
            l=mid+1;
        }
        else if(arr[mid]<target)
        {
            l=mid;
        }
        else if(arr[mid]>target)
            r=mid-1;
    }
    if(l>=n||l<0)
        return -1;
    else if(arr[l]==target)
    {
        return l;
    }
    else return -1;
}

int main()
{
    int target;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    scanf("%d",&target);
    int ans=erfen(target);
    printf("%d",ans);
    return 0;
}

 

相关标签: 杂学