1 条题解

  • 0
    @ 2014-4-2 9:14:38

    【例73.2】 数组的距离

    解题思路

    两个数组分别升序排序,双指针比较当前差并更新最小值;较小值所在指针前进,寻找更接近另一值的候选。相等时最小距离0可立即结束。

    正确性说明

    当a[i]<b[j]时,a[i]与后续更大b的差不会比当前小,可安全丢弃a[i];另一情况对称。被丢弃元素的最好可能配对都已考虑,因此不漏最小距离。

    易错点

    两个值必须各来自一个数组;用long long求差。

    复杂度

    时间O(n log n+m log m),空间O(n+m)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n, m;
        cin >> n >> m;
        vector<long long> a(n), b(m);
        for (auto &x : a)
            cin >> x;
        for (auto &x : b)
            cin >> x;
        sort(a.begin(), a.end());
        sort(b.begin(), b.end());
        int i = 0, j = 0;
        long long ans = LLONG_MAX;
        while (i < n && j < m) {
            ans = min(ans, llabs(a[i] - b[j]));
            if (a[i] < b[j])
                i++;
            else if (a[i] > b[j])
                j++;
            else
                break;
        }
        cout << ans << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    478
    时间
    1000ms
    内存
    64MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者