An interval is represented as a combination of start time and end time. Given a set of intervals, check if any two intervals overlap.

Input: arr[] = {{1,3}, {5,7}, {2,4}, {6,8}} Output: true The intervals {1,3} and {2,4} overlap Input: arr[] = {{1,3}, {7,9}, {4,6}, {10,13}} Output: false No pair of intervals overlap.

Expected time complexity is O(nLogn) where n is number of intervals.

**We strongly recommend to minimize your browser and try this yourself first.**

A **Simple Solution** is to consider every pair of intervals and check if the pair overlaps or not. The time complexity of this solution is O(n^{2})

A better solution is to **Use Sorting**. Following is complete algorithm.

1) Sort all intervals in increasing order of start time. This step takes O(nLogn) time.

2) In the sorted array, if start time of an interval is less than end of previous interval, then there is an overlap. This step takes O(n) time.

So overall time complexity of the algorithm is O(nLogn) + O(n) which is O(nLogn).

Below is C++ implementation of above idea.

// A C++ program to check if any two intervals overlap #include <iostream> #include <algorithm> using namespace std; // An interval has start time and end time struct Interval { int start; int end; }; // Compares two intervals according to their staring time. // This is needed for sorting the intervals using library // function std::sort(). See http://goo.gl/iGspV bool compareInterval(Interval i1, Interval i2) { return (i1.start < i2.start)? true: false; } // Function to check if any two intervals overlap bool isOverlap(Interval arr[], int n) { // Sort intervals in increasing order of start time sort(arr, arr+n-1, compareInterval); // In the sorted array, if start time of an interval // is less than end of previous interval, then there // is an overlap for (int i=1; i<n; i++) if (arr[i-1].end > arr[i].start) return true; // If we reach here, then no overlap return false; } // Driver program int main() { Interval arr1[] = {{1,3}, {7,9}, {4,6}, {10,13}}; int n1 = sizeof(arr1)/sizeof(arr1[0]); isOverlap(arr1, n1)? cout << "Yes\n" : cout << "No\n"; Interval arr2[] = { {6,8},{1,3},{2,4},{4,7} }; int n2 = sizeof(arr2)/sizeof(arr2[0]); isOverlap(arr2, n2)? cout << "Yes\n" : cout << "No\n"; return 0; }

Output:

No Yes

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above