【LeetCode】56. Merge Intervals

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

【分析】

   本题旨在合并区间,给定的区间存在交集,我们需要将这些有交集的区间合并,并按照从小到大的顺序排列。思路是很简单的:

  1、题目并没有说明输入的区间是排序的,因此,我们要做的第一步就是对区间排序,而区间包含start和end,鉴于此,我们可将start作为主关键字,end作为次关键字,相邻区间按照start升序排列,start相等则按end升序排列;

  2、预处理排序中需用到sort(intervals.begin(),intervals.end(),cmp)函数,需要注意比较函数cmp,如果采用面向对象编程的c++或者Java,需注意,cmp函数要么设置为全局函数(类外),要么定义为静态成员函数(静态方法)(类内)。

  3、边界条件及特殊情况,a.只有一个输入区间;b.最后一个区间需和前一个区间合并;c.前一个区间包含后一个区间;

【解法及注释】

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
 bool cmp1(Interval a,Interval b)//sort()按关键字排序
    {
        if(a.start<b.start) return true;
        else if(a.start>b.start) return false;
        else return a.end<b.end;
    }
    
class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        
        Interval temp;//中间变量
        vector<Interval> result;//存储合并结果
        int length=intervals.size();
        if(intervals.empty())return result;//输入为空,返回
        
        sort(intervals.begin(),intervals.end(),cmp1);//按关键词升序排列
        temp=intervals[0];
        if(length==1)result.push_back(temp);
        
        for(int i=1;i<length;i++)
        {
            if(temp.end>=intervals[i].start)//如果相邻区间存在交集且预备合并
            {
                if(temp.end<intervals[i].end)//合并边界
                temp.end=intervals[i].end;
            }
            else
            {
                result.push_back(temp);//如果相邻区间无交集,保存,temp替换
                temp=intervals[i];
            }
            if(i==length-1) result.push_back(temp);//边界处理
        }
        return result;
    }
};
【运行结果】

                【LeetCode】56. Merge Intervals_第1张图片

你可能感兴趣的:(LeetCode,C++,merge,Intervals,区间合并)