Wednesday, April 24, 2013

merge k sorted list of intervals(C++ code)

n个人,每个人有m个时间段,每个时间段代表这个人是忙碌的
例如:
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)



  1. struct Interval{  
  2.   
  3. int left;  
  4.   
  5. int right;  
  6.   
  7. Interval *next;  
  8.   
  9. }  
  10.   
  11. vector<Interval> mergeInterval(vector<Interval *> &input ){  
  12.   
  13.   vector<Interval> res;  
  14.   
  15.   priority_queue<Interval*, comp> q;  
  16.   
  17.   for(int i = 0; i < input.size(); i++){  
  18.   
  19.     q.push(input[i]);  
  20.   
  21.     input[i] = input[i]->next;  
  22.   
  23.  }  
  24.   
  25. }  
  26.   
  27. while(!q.empty()){  
  28.   
  29.  Interval* I = q.top();  
  30.   
  31.  q.pop();  
  32.   
  33.  if(I->next) q.push(I->next);   
  34.   
  35.  while(!q.empty){  
  36.   
  37.    Interval *J = q.top;  
  38.   
  39.    if(J->left <= I->right ){  
  40.   
  41.      q.pop(); I->right = max(J->right, I->right);  
  42.   
  43.      if(J->next) q.push(J->next);   
  44.   
  45.    }  
  46.   
  47.    else {  
  48.   
  49.      res.push_back(*I);   
  50.   
  51.      break;  
  52.   
  53.    }  
  54.   
  55.  }  
  56.   
  57.   
  58.   
  59. res.push_back(*I);  
  60.   
  61.   
  62.   
  63. return res;   
  64.   
  65. }  

No comments:

Post a Comment