二分个人看法(供参考)

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

[L,R]

#include 


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)
            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

2.取重复值最左侧

[L,R)

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

所以代码是

#include 


using namespace std;
int arr[150],n;
int erfen(int target)
{
    int l=0,mid;
    int r=n;
    while(ltarget)
            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

3.取最右侧

[L,R)

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

代码

#include 


using namespace std;
int arr[150],n;
int erfen(int target)
{
    int l=0,mid;
    int r=n;
    while(ltarget)
            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

 

你可能感兴趣的:(杂学)