最大重叠区间数目 Maximum number of overlapping intervals
有一个party,许多人来参加。一个记录仪记录下了每个人到达的时间 s_i 和离开的时间 e_i ,也就是说每个人在party的时间为 [ s_i, t_i ]。求出这个party 同一时刻最多接纳了多少人。例如:
Input: arrl [] = {1, 2, 9, 5, 5}
exit [] = {4, 5, 12, 9, 12}
First guest in array arrives at 1 and leaves at 4, second guest arrives at 2 and leaves at 5, and so on.
Output: 5。There are maximum 3 guests at time 5.
An Efficient Solution is to use sorting n O(nLogn) time. The idea is to consider all events (all arrivals and exits) in sorted order. Once we have all events in sorted order, we can trace the number of guests at any time keeping track of guests that have arrived, but not exited.
Consider the above example.
arr[] = {1, 2, 10, 5, 5} dep[] = {4, 5, 12, 9, 12} Below are all events sorted by time. Note that in sorting, if two events have same time, then arrival is preferred over exit. Time Event Type Total Number of Guests Present ------------------------------------------------------------ 1 Arrival 1 2 Arrival 2 4 Exit 1 5 Arrival 2 5 Arrival 3 // Max Guests 5 Exit 2 9 Exit 1 10 Arrival 2 12 Exit 1 12 Exit 0
Total number of guests at any time can be obtained by subtracting
total exits from total arrivals by that time.
So maximum guests are three at time 5.
Following is C++ implementation of above approach. Note that the implementation doesn’t create a single sorted list of all events, rather it individually sorts arr[] and dep[] arrays, and then uses merge process of merge sort to process them together as a single sorted array.
// Program to find maximum guest at any time in a party #include<iostream> #include<algorithm> using namespace std; void findMaxGuests(int arrl[], int exit[], int n) { // Sort arrival and exit arrays sort(arrl, arrl+n); sort(exit, exit+n); // guests_in indicates number of guests at a time int guests_in = 1, max_guests = 1, time = arrl[0]; int i = 1, j = 0; // Similar to merge in merge sort to process // all events in sorted order while (i < n && j < n) { // If next event in sorted order is arrival, // increment count of guests if (arrl[i] <= exit[j]) { guests_in++; // Update max_guests if needed if (guests_in > max_guests) { max_guests = guests_in; time = arrl[i]; } i++; //increment index of arrival array } else // If event is exit, decrement count { // of guests. guests_in--; j++; } } cout << "Maximum Number of Guests = " << max_guests << " at time " << time; } // Driver program to test above function int main() { int arrl[] = {1, 2, 10, 5, 5}; int exit[] = {4, 5, 12, 9, 12}; int n = sizeof(arrl)/sizeof(arrl[0]); findMaxGuests(arrl, exit, n); return 0; }