假设我们有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}