• 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;
        }
    };
    太丑了还是别看了
  • 相关阅读:
    Gradle with Kotlin (二) 项目、Java项目、父子、同级共享代码
    Gradle with Kotlin (一) 安装、DSL、任务、插件
    辛弃疾
    Remote Method Invoke
    Webpack (一) 选项和配置
    《芙蓉女兒誄》
    js 原型链之我见
    js 库
    Gradle
    Spring Boot 入门
  • 原文地址:https://www.cnblogs.com/superzrx/p/3354472.html
Copyright © 2020-2023  润新知