码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode | Merge Intervals

时间:2015-07-25 18:29:50      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:merge

Merge Intervals : https://leetcode.com/problems/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].


解析:

容易想到,先按start对各区间排序,然后比较相邻的2个区间的end和start的大小,如果intervals[i].end >= intervals[i+1].start 则可以合并,但需要注意的是,如果intervals[i].end >= intervals[i+1].end,则前一个完全包含后一个,因此在判断能够合并时,还要判断存在完全包含的情况,如果不包含,才需要改变前一个的end。

e.g.

  • [1, 4],[2, 3] => [1, 4]; // 容易忘记,完全包含,前一项的end不变
  • [1, 4], [2, 5] => [1, 5]; // 部分重叠,后项的end覆盖前项的end
  • [1, 4] [5, 6] => [1, 4], [5, 6]; // 无重叠

另外,在以下程序中,用额外空间result保存最终结果。
如果在Intervals中原位保存结果,则需要释放掉被重叠的项,我们知道vector是数组形式,每删除一项就是O(n),因此不建议这样做(事实是,leetcode 也会超时)。

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
 // 时间O(n),空间O(n)
class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        if (intervals.size() <= 1)
            return intervals;
        vector<Interval> result;
        sort(intervals.begin(), intervals.end(), cmp);
        result.push_back(intervals[0]);
        int j = 1;
        while (j < size) {
            Interval &p = result.back();
            if (p.end >= intervals[j].start) {
                if (p.end < intervals[j].end)
                    p.end = intervals[j].end;
            } else {
                result.push_back(intervals[j]);
            }
            j++;

        }

        return result;
    }
public:
    static bool cmp(const Interval& i1, const Interval& i2) {
        return i1.start < i2.start;    
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

leetcode | Merge Intervals

标签:merge

原文地址:http://blog.csdn.net/quzhongxin/article/details/47058359

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!