LeetCode-Merge Intervals

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;
    }
};
太丑了还是别看了

 

posted @ 2013-10-06 19:10  懒猫欣  阅读(144)  评论(0编辑  收藏  举报