LeetCode Merge Intervals

来源:互联网 发布:格式化u盘恢复数据 编辑:程序博客网 时间:2024/06/07 03:56

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].

一开始sb了 用数组代表坐标记录覆盖地点,然后单独处理开始等于结束的点

/** * Definition for an interval. * struct Interval { *     int start; *     int end; *     Interval() : start(0), end(0) {} *     Interval(int s, int e) : start(s), end(e) {} * }; */class Solution {public:    void setbit(char* array,int begin,int end)    {        for(int i=begin;i<end;++i)        {            array[i] = 1;        }    }    vector<Interval> merge(vector<Interval> &intervals) {        size_t LEN = 65535;        vector<Interval> vec;        set<int> same;        char array[LEN];        memset(array,0,sizeof(char)*LEN);        vector<Interval>::iterator i = intervals.begin();        for(i;i!=intervals.end();++i)        {            if((*i).start == (*i).end)            {                same.insert((*i).start);            }            setbit(array,(*i).start,(*i).end);        }        int tmp = 0;        int start,end;        bool isstart = false;        int c = 0;        set<int>::iterator it = same.begin();        while(it!=same.end())        {            if((*it > 0) && (array[(*it)]||array[((*it) - 1)]) || (*it==0 && array[0]))                    same.erase(it++);            else                ++it;        }                        for(set<int>::iterator it = same.begin();it!=same.end();++it)        {                            Interval *interval = new Interval(*it,*it);                vec.push_back(*interval);        }                        for(int n=0;n<LEN;++n)        {            if(tmp!=array[n])            {               if(!isstart)               {                   start = n;                   isstart = true;               }               else               {                   end = n;                   isstart = false;                   Interval *interval = new Interval(start,end);                   vec.push_back(*interval);               }            }            tmp = array[n];        }        return vec;            }};


觉得不能这么长  看了discuss  原来就是merge过程 然后自己写了个merge 好短= =、

bool CMP(const Interval& it1,const Interval& it2){    if(it1.start!=it2.start)        return it1.start < it2.start;    else        return it1.end < it2.end;}class Solution {public:        vector<Interval> merge(vector<Interval> &intervals) {        vector<Interval> rsvec;        if(intervals.size()==0)            return rsvec;        std::sort(intervals.begin(),intervals.end(),CMP);        int startp=(intervals.begin())->start,endp=(intervals.begin())->end;        if(intervals.size()==1)        {            rsvec.push_back(*(new Interval(startp,endp)));            return rsvec;        }        vector<Interval>::iterator i=intervals.begin();        for(i;i!=intervals.end();++i)        {            if((*i).start > endp)            {                rsvec.push_back(*(new Interval(startp,endp)));                startp = (*i).start;                endp = (*i).end;            }            else if((*i).end > endp)                endp = (*i).end;                        }        rsvec.push_back(*(new Interval(startp,endp)));        return rsvec;            }};


0 0
原创粉丝点击