056 Merge Intervals[M]

1 题目描述

Given a collection of intervals, merge all overlapping intervals.

题目难度:Medium

2 题目样例

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

3 题意分析

简而言之就是要合并区间。

观察样例,[1,3]和[2,6]区间可以合并为[1,6],至于没有相邻的[8,10],[15,18]则保持原有样子不变。

4 思路分析

这道题目的思路很简单,只需要模拟样例中合并区间的过程就可以了。

首先要做的是给区间集排序(以区间起点的大小作为标准去排序),排序完成后先把第一个区间存入结果中,然后以第二个区间为开头进行区间集遍历。如果结果中最后一个区间和遍历的当前区间没有重合的部分,就直接将当前的区间存入结果中,如果有重合则将结果中最后一个区间的end值更新为结果中最后一个区间的区间终点和当前终点的较大值,然后继续重复上述过程,即可得到上述结果。

注意这里我们要重写排序函数,因为是对结构体进行排序。

代码实现如下:

/**
 * 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:
    static bool comp( const Interval &a, const Interval &b)
    {
        return (a.start < b.start);
    }
    vector<Interval> merge(vector<Interval>& intervals)
    {
        vector<Interval> res;  
        if (intervals.empty())   return res; 
        sort(intervals.begin(), intervals.end(),comp);
        res.push_back(intervals[0]);
        for(int i = 1; i < intervals.size(); ++i)
        {
            if (res.back().end >= intervals[i].start)
                res.back().end = max(res.back().end, intervals[i].end);
            else
                res.push_back(intervals[i]); 
        }
        return res;
    }
};

5 后记

最近学校的事情太多….一忙起来把Leetcode这件事情给忘记了,过了这么久才更新,实在是对不起大家!

    原文作者:Lolita
    原文地址: https://zhuanlan.zhihu.com/p/34971360
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞