【笔记】远亲不如近邻 --二分法
远亲不如近邻
求距离最小值,很容易想到二分法;但此题比较的是距离,因此我是这么理解的:
- 定义一个ans,表示当前最小距离,当出现最小距离时,更新ans值
- 分别求出大于Key的第一个值以及小于Key的最后一个值,比较这两个值与key的距离
- 输出所有方案的最小距离。
AC代码:
vector<int> solve(int n, int m, vector<int>& a, vector<int>& x) {
sort(a.begin(),a.end());
vector<int> pos(m);
int ans=2e9;
for(int i=0;i<m;++i)
{
int low=0;
int high=n-1;
if(x[i]<a[0])
ans=a[0]-x[i];
else
{
while(low<=high)
{
int mid=(low+high)/2;
if(a[mid]<=x[i])
{
ans=min(ans,x[i]-a[mid]);
low=mid+1;
}
else
high=mid-1;
}
}
if(x[i]>a[n-1])
ans=min(ans,x[i]-a[n-1]);
else
{
low=0,high=n-1;
while(low<=high)
{
int midd=(low+high)>>1;
if(a[midd]>=x[i])
{
ans=min(ans,a[midd]-x[i]);
high=midd-1;
}
else
low=midd+1;
}
}
pos[i]=ans;
ans=2e9;
}
return pos;
}