LeetCode-Merge Intervals
2013-10-06 19:10
288 查看
Given a collection of intervals, merge all overlapping intervals.
For example,
Given
return
太丑了还是别看了
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; } };
太丑了还是别看了
相关文章推荐
- 【LeetCode】Merge Intervals 解题报告
- LeetCode056 Merge Intervals
- LeetCode-Merge Intervals-合并区间
- [leetcode刷题系列]Merge Intervals
- LeetCode Merge Intervals
- leetcode | Merge Intervals
- leetcode -- Merge Intervals
- LeetCode - Merge Intervals
- LeetCode Online Judge 题目C# 练习 - Merge Intervals
- leetcode[55] Merge Intervals
- LeetCode刷题【Array】 Merge Intervals
- LeetCode-Merge Intervals
- leetcode || 56、 Merge Intervals
- LeetCode 56 Merge Intervals
- Leetcode: Merge Intervals
- LeetCode:Merge Intervals
- 【leetcode刷题笔记】Merge Intervals
- LeetCode 56, Merge Intervals 从 TLE 到 AC
- leetcode--Merge Intervals
- leetcode--Merge Intervals