【问题标题】:min difference between two unsorted arrays两个未排序数组之间的最小差异
【发布时间】:2019-03-17 18:11:38
【问题描述】:

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

然后检查它是否最小并将其存储起来以供进一步比较

测试用例:

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) min 为 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();
    }
}

【问题讨论】:

  • 如果您要发布在线裁判比赛代码,您应该首先摆脱所有这些输入语句,而是将数据硬编码到程序中。当他们试图运行您的代码时,没有人会坐在那里一遍又一遍地输入数据。
  • 您的代码无法产生您描述的输出。
  • @PaulMcKenzie 你是对的,当然,但我承认他在作弊,我给予 OP 信用。 /s
  • @OP This is an example。无需反复输入数据,代码测试方便。
  • int ans=a[0]-b[0]; 应该是int ans=std::abs(a[0]-b[0]);

标签: c++ arrays algorithm


【解决方案1】:

您的版本有几个问题:

  • 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

【讨论】:

  • 您的上述评论使我的解决方案被接受,但感谢您编写解决方案 Love from india
猜你喜欢
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多