【问题标题】:Find coverage of a set of intervals查找一组区间的覆盖范围
【发布时间】:2015-05-19 13:03:14
【问题描述】:

我很久以前在准备面试时遇到了这个问题,并认为这是一个有趣的问题需要解决。问题是这样的: 找到一组区间的覆盖范围 例如 - 给定 [1,4), [-2,3), [9,10) :输出应为 7(区间集涵盖 -2,-1,0,1,2,3,9) .

我最初的方法是迭代一组区间;将每个间隔中的数字添加到排序链接列表中。如果排序列表中已经存在任何数字,请跳过它。我相信这需要 O(N^2) 时间并消耗 O(N) 空间,所以我们可能会做得更好。

或者,我们可以使用Interval BST。但是,这似乎主要用于确定是否与给定间隔(需要 O(lgn))重叠。找到它的覆盖范围似乎又需要 O(n^2) 。我们能比 O(n^2) 做得更好吗?

【问题讨论】:

    标签: algorithm intervals


    【解决方案1】:

    您可以将它们视为成对并按第一个元素对其进行排序。

    排序后你会得到:{, , }。

    排序将花费 O(NlogN)。

    现在让变量 sum = 0。

    然后设置 L = (1).left 和 R = (1).right。

    线性遍历所有内容,保持你遇到的最大 R 直到 R

    空间也是线性的。

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <climits>
    
    using namespace std;
    typedef pair<int, int> pii;
    
    int main() {
        int l, r;
        vector<pii> pairs;
        while (cin >> l >> r) {
            pairs.emplace_back(l, r);
        }
        pairs.emplace_back(INT_MAX, INT_MAX); // sentinel
        sort(pairs.begin(), pairs.end(), 
        [](const pii& x, const pii& y) { return x.first < y.first; });
    
        auto p_one = pairs.begin(), p_two = pairs.begin() + 1;
        int L = p_one->first;
        int R = p_one->second;
        int sum = 0;
        while (p_two != pairs.end()) {
            if (R < p_two->first) {
                sum += abs(L - R) + 1;
                L = p_two->first;
                R = INT_MIN;
            }
            p_one++; p_two++;
            if (p_one->second > R) R = p_one->second;
        }
        cout << sum;
    }
    

    附:我还没有完全测试代码,但它似乎可以工作。

    【讨论】:

    • @j_random_hacker 是的,它会执行,你甚至测试过代码吗?你看到我加了一个哨兵吗? ideone.com/wCVAWJ
    • @j_random_hacker 请记住,这些不是矩形,它们是间隔,所以当你输入时,你的 L 总是小于或等于 R。矩形也不能有负参数。
    • 我错过了哨兵。不知道你为什么要我记住这些不是矩形 - 它们不是很多东西,我应该记住它们吗?
    • @j_random_hacker 哈哈,好吧。
    • @j_random_hacker 我最初的解决方案在最后添加了“活动矩形的宽度”,正如你所说,但后来我决定添加一个哨兵,没有哨兵代码看起来非常混乱,考虑在循环之后你必须写多少个 if : 1) 测试 if (n-1).right
    猜你喜欢
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多