您的位置:首页 > 其它

LeetCode-Merge Intervals

2013-10-06 19:10 288 查看
Given a collection of intervals, merge all overlapping intervals.

For example,

Given
[1,3],[2,6],[8,10],[15,18]
,

return
[1,6],[8,10],[15,18]
.

class Solution {
struct IntvTreeNode{
int start;
int end;
int max;
IntvTreeNode* left;
IntvTreeNode* right;
IntvTreeNode(){

}
IntvTreeNode(int ps,int pe){
start=ps;
end=pe;
max=-1;
if(ps==pe-1){
left=NULL;
right=NULL;
return;
}
int mid=(ps+pe)/2;
left=new IntvTreeNode(ps,mid);
right=new IntvTreeNode(mid,pe);
}
};
void Insert(int start,int end,IntvTreeNode* root){
if(root->max==root->end-root->start)return;
if(root->start==root->end-1){
if(start!=end)
root->max=1;
else root->max=0;
return;
}
int mid=(root->start+root->end)/2;
if(end<mid){
Insert(start,end,root->left);
}
else if(end==mid){
if(start==end)Insert(start,end,root->right);
else Insert(start,end,root->left);
}
else if(start>=mid){
Insert(start,end,root->right);
}
else{
Insert(start,mid,root->left);
Insert(mid,end,root->right);

}
if(root->left->max==root->left->end-root->left->start
&&root->right->max==root->right->end-root->right->start)
root->max=root->end-root->start;
}
void Output(vector<int>& ret,IntvTreeNode* root){
if(root->max==root->end-root->start){
ret.push_back(root->start);
ret.push_back(root->end);
return;
}
else if(root->max==0){
ret.push_back(root->start);
ret.push_back(root->start);
return;
}
if(root->start==root->end-1)return;
Output(ret,root->left);
Output(ret,root->right);
}
public:
vector<Interval> merge(vector<Interval> &intervals) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(intervals.size()==0)return intervals;
map<int,int> ma;
set<int> se;

for(int i=0;i<intervals.size();i++){
se.insert(intervals[i].start);
se.insert(intervals[i].end);
}
int index=0;
for(set<int>::iterator it=se.begin();it!=se.end();it++){
ma[*it]=index;
index++;
}
IntvTreeNode* root =new IntvTreeNode(0,index);
for(int i=0;i<intervals.size();i++){
int start=ma[intervals[i].start];
int end=ma[intervals[i].end];
Insert(start,end,root);
}
vector<int> vec;
Output(vec,root);
bool start=false;
int size;
vector<Interval>ret;
vector<int> mam(se.begin(),se.end());
ret.push_back(Interval(mam[vec[0]],mam[vec[1]]));
for(int i=2;i<vec.size();i+=2){
if(vec[i-1]==vec[i])
{
ret[ret.size()-1].end=mam[vec[i+1]];
}
else ret.push_back(Interval(mam[vec[i]],mam[vec[i+1]]));
}
return ret;
}
};


太丑了还是别看了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: