两个未排序数组之间的最小差异

时间:2019-03-17 18:11:38

标签: c++ arrays algorithm

我必须找到未排序数组的两个元素之间的最小绝对差。 我的方法是先对两个数组都进行排序,在一个数组上运行一个循环,然后在另一个数组中找到该数组的每个元素的下限。

然后检查是否为最小值并将其存储以进行进一步比较

测试用例:

2
8 1 3 5 7 9 7 3 1

8 2 4 6 8 10 8 6 2

8 2 3 5 10 9 3 2 1

7 1 2 6 12 13 3 2

输出:

1
0

结果:通过

说明:

1)分钟将为abs(a [7] -b [7])

2)分钟将为abs(a [0] -b [(1)])

但是当我向spoj提交时,我得到了错误的答案,看来我正在丢失其他东西。

问题https://www.spoj.com/problems/ACPC11B/

请帮助我哪里做错了?

我的代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector <int> a;
vector <int> b;
int main(){
    int t;
    cin>>t;
    while(t--){
        int na;
        cin>>na;
        for(int i=0;i<na;i++){
            int temp;
            cin>>temp;
            a.push_back(temp);
        }
        int nb;
        cin>>nb;
        for(int i=0;i<nb;i++){
            int temp;
            cin>>temp;
            b.push_back(temp);
        }
        sort(a.begin(),a.end());
        sort(b.begin(),b.end());
        int ans=a[0]-b[0];
        for(int i=0;i<a.size();i++){
            int bval = lower_bound(b.begin(),b.end(),a[i])-b.begin();
            ans = min(ans,abs(a[i]-b[bval]));
            if(bval>0)
            ans = min(ans,abs(a[i]-b[bval-1]));
        }
        cout<<ans<<endl;
        a.clear();
        b.clear();
    }
}

1 个答案:

答案 0 :(得分:0)

您的版本有几个问题:

  • a[0]-b[0]可能为负,使剩余计算无效。
  • lower_bound,可能导致b.end()导致超出限制的访问。

您可以执行以下操作:

std::size_t min_distance(std::vector<int> v1, std::vector<int> v2)
{
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    auto it1 = v1.begin();
    auto it2 = v2.begin();
    auto min = std::abs(*it1 - *it2);

    while (min != 0 && it1 != v1.end() && it2 != v2.end()) {
        min = std::min(min, std::abs(*it1 - *it2));
        if (*it1 < *it2) {
            ++it1;   
        } else /*if (*it2 <= *it1)*/ {
            ++it2;
        }
    }
    return min;
}

Demo