二分个人看法(供参考)
程序员文章站
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;
}
上一篇: 使用jsp实现表单与服务器的简单交互