【笔记】远亲不如近邻 --二分法

远亲不如近邻

求距离最小值,很容易想到二分法;但此题比较的是距离,因此我是这么理解的:

  • 定义一个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;
    }
posted @ 2020-08-16 18:10  清蒸母猪  阅读(127)  评论(0编辑  收藏  举报