您的位置:首页 > 其它

[Leetcode 56, Hard] Merge intervals

2013-11-10 05:56 417 查看
Problem:

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

1. Brute-force method.

2. Sort.

Solution:

Brute-force solution:

bool isIntersection(Interval &int1, Interval &int2){
        if(int1.end<int2.start || int2.end<int1.start) return false;
        return true;
    }
    
    void mergeIntervalsToFirst(Interval &int1, Interval &int2){
        if(int1.start>int2.start) int1.start=int2.start;
        if(int1.end<int2.end) int1.end=int2.end;
    }
    
    vector<Interval> merge(vector<Interval> &intervals) {
        vector<Interval> rint;
        if(intervals.size()==0) return rint;
        
        int len=intervals.size();
        bool isMerge=false;
        for(int i=0; i<len; ++i){
            if(i==0) rint.push_back(intervals[0]);
            else{
                int lenRint=rint.size();
                for(int j=0; j<lenRint; ++j){
                    if(isIntersection(rint[j], intervals[i])){
                        mergeIntervalsToFirst(rint[j], intervals[i]);
                        //Check after intervals whether to be included.
                        std::vector<Interval>::iterator iter=rint.begin()+j+1;
                        while(iter!=rint.end()){
                            if(isIntersection(rint[j], *iter)){
                                mergeIntervalsToFirst(rint[j], *iter);
                                rint.erase(iter);
                            }else ++iter;
                        }
                        isMerge=true;
                        break;
                    }
                }
                if(!isMerge)    rint.push_back(intervals[i]);
                else isMerge=false;
            }
        }
        return rint;
    }


2. Need to make up.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: