例如:
A: (1, 2), (7, 9)
B: (1, 3), (4, 5)
C: (12, 15)
D: (16, 20)
每个人的时间段都是排好序的(时间段是inclusive的, 抱歉没说清楚)。
输出:时间段的集合,在这个时间段里,有人是忙碌的。
上面例子中的输出就应该是:{(1, 5), (7, 9), (12, 20)}
----------------
思路:用heap存每行的第一个元素,每次取最小值,和相关的interval merge, 产生结果的interval .
假如n行m列,时间复杂度为O((n*m)log n )(每个元素都会被推进和推出heap)
- struct Interval{
- int left;
- int right;
- Interval *next;
- }
- vector<Interval> mergeInterval(vector<Interval *> &input ){
- vector<Interval> res;
- priority_queue<Interval*, comp> q;
- for(int i = 0; i < input.size(); i++){
- q.push(input[i]);
- input[i] = input[i]->next;
- }
- }
- while(!q.empty()){
- Interval* I = q.top();
- q.pop();
- if(I->next) q.push(I->next);
- while(!q.empty){
- Interval *J = q.top;
- if(J->left <= I->right ){
- q.pop(); I->right = max(J->right, I->right);
- if(J->next) q.push(J->next);
- }
- else {
- res.push_back(*I);
- break;
- }
- }
- res.push_back(*I);
- return res;
- }
No comments:
Post a Comment