假设我们有N个间隔,形式为{L,R},L是开始时间,R是结束时间。我们必须找到所有间隔的交集。相交是位于所有给定间隔内的间隔。如果找不到,则返回-1。例如,如果间隔类似于[{1,6},{2,8},{3,10},{5,8},则输出间隔为{5,6}
为了解决这个问题,我们将按照以下步骤操作:
考虑第一个间隔是最后一个间隔
从第二个间隔开始,尝试搜索交点。可能有两种情况
仅当R1 <L2或R2 <L1时[L1,R1]和[L2,R2]之间不可能有交集,在这种情况下,答案将为0
[L1,R1]和[L2,R2]之间没有交集,则所需的交集为{max(L1,L2),min(R1,R2)}
#include<iostream> #include<algorithm> using namespace std; class interval{ public: int left, right; }; void findIntersection(interval intervals[], int N) { int l = intervals[0].left; int r = intervals[0].right; for (int i = 1; i < N; i++) { if (intervals[i].left > r || intervals[i].right < l) { cout << -1; return; } else { l = max(l, intervals[i].left); r = min(r, intervals[i].right); } } cout << "{" << l << ", " << r << "}"; } int main() { interval intervals[] = {{ 1, 6 }, { 2, 8 }, { 3, 10 }, { 5, 8 } }; int N = sizeof(intervals) / sizeof(intervals[0]); findIntersection(intervals, N); }
输出结果
{5, 6}