查找C ++中所有区间的交集

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