当前位置: 首页 > 知识库问答 >
问题:

查找一组间隔的覆盖范围

陆运乾
2023-03-14

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

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

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

共有1个答案

龙佐
2023-03-14

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

排序后,您将有:{

排序将需要O(NlogN)。

现在做一个变量sum=0。

然后设置L=(1)。左,R=(1)。右。

线性遍历所有对象,保持遇到的最大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;
}

附言:我还没有完全测试代码,但它似乎有效。

 类似资料:
  • [2,30],[25,39],[30,40]溶胶[2,30]

  • 问题内容: 我需要检索一份雇员列表,并为每位雇员列出他们在给定年度内积极参与福利保障的几个月的清单。有一个包含工作数据的表和一个包含福利信息的表。还有一个交付日期表,该表列出了2007-2018年的每个日期,并针对每个日期显示月,日和日历年。 我现在编写查询的方式是说:在日期表中找到提示年份的01/01到12/31之间的所有日期(或当前日期,以较早的日期为准),2)员工在福利表上活跃的时间。对于每

  • 假设我有一个这样的范围列表 现在我想找到一个范围,比如。我的算法应该给我这个范围的所有范围。例如,这个的输出应该是 <代码>输出-[1,3]、[2,5]、[4,6]、[8,10] 我该如何着手解决这个问题? PS:我知道段树可能会有所帮助。我可以在其中构建树来存储间隔并查询位于间隔内的Point,但如何在给定间隔的情况下获取所有间隔。

  • 考虑以下代码: 测试可按如下方式执行: 覆盖报告将考虑涵盖的所有第100%行,即使启用分支覆盖: 然而,这段代码有一个错误,那些有敏锐眼光的人可能已经看到了。如果它进入“其他”分支,将会有一个例外: 修复该错误很容易:将未定义的名称更改为文本。还可以很容易地添加另一个测试来揭示错误:。这也不是这个问题所要问的。我想知道如何找到尽管有100%的代码覆盖率报告但从未实际执行过的代码段。 使用条件表达式

  • 我有一个关于Hackkerrank的挑战如下 示例 票=[8,5,4,8,4] 已排序的有效子序列为{4,4,5}和{8,8}。这些子序列的m值分别为3和2。返回3。 功能描述 在下面的编辑器中完成maxTickets函数。 采样输入0 STDIN函数 4张票[]大小n=4 2 3 示例输出0 输出: 我的代码能用吗?有没有我的代码失败的情况?你能为这个挑战提供一个更好的算法吗?

  • 我有一组不重叠的,不相邻的区间,例如[{10,15},{30,35},{20,25}]。它们没有排序,但如果需要,我可以对它们进行排序。 现在,我得到了一些新的区间,例如{5,32},并希望生成一组新的区间来描述差异:这个新区间所覆盖的范围不在该集合中。在这个例子中,答案是:[{5,9},{16,19},{26,29}]。 计算这个的快速算法是什么?请注意,集合中通常有1个,有时有2个,很少有3个