Leetcode 56. Merge Intervals && 57. Insert Interval(Hard)

56. Merge Intervals

Problem :

Given a collection of intervals, merge all overlapping intervals.

Example:
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

Algorithm:
本题为一个合并区间的题目,即给定一组区间,将多个存在重叠部分的区间合并为一个大区间。本题的具体思路为,首先将所有区间按照左端点从小到大的顺序重新排列。然后,对于相邻两个区间,如果前一个区间的右端点大于后一区间的左端点,则表明两个区间需要进行合并,合并后的新区间的右端点即为两者右端点中的最大值。继续向后进行上述比较,直到前一个区间的右端点小于后一区间的左端点,则表明前一区间已经不会继续向后合并,前一区间加入新区间集合中。
重复上述过程,扫描完所有区间,即可得到答案。其中,排序所需时间为O(nlogn),从头到尾遍历所有区间需要时间为O(n),总时间复杂度为O(nlogn)。

Code:

/**
 * 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 cmd(Interval n1, Interval n2){
    return n1.start < n2.start;
}

class Solution {
public:

    vector<Interval> merge(vector<Interval>& intervals) {
        if(intervals.size() == 0) return vector<Interval>();
        sort(intervals.begin(), intervals.end(), cmd);

        vector<Interval> ans;
        int tb = intervals[0].start;
        int te = intervals[0].end;
        for(int i = 1; i < intervals.size(); ++i) {
            if(intervals[i].start > te){
                ans.push_back(Interval(tb, te));
                tb = intervals[i].start;
                te = intervals[i].end;
            }
            else if(intervals[i].end > te) te = intervals[i].end;
        }
        ans.push_back(Interval(tb, te));
        return ans;
    }
};

57. Insert Interval

Problem :
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example:
Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

Algorithm:
本题和56题为两道母子题。本题的做法为,先将所给区间插入所给区间序列合适的位置中,然后与56题采用相同的做法即可。
其中,插入区间所需时间为O(n),从头到尾遍历所有区间需要时间为O(n),总时间复杂度为O(n)。

Code:

/**
 * 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 cmd(Interval n1, Interval n2){
    return n1.start < n2.start;
}

class Solution {
public:

    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
        bool judge = false;

        for(int i = 0; i < intervals.size(); ++i) {
            if(intervals[i].start > newInterval.start) {
                intervals.insert(intervals.begin() + i, newInterval);
                judge = true;
                break;
            }
        }
        if(!judge) intervals.push_back(newInterval);

        vector<Interval> ans;
        int tb = intervals[0].start;
        int te = intervals[0].end;
        for(int i = 1; i < intervals.size(); ++i) {
            if(intervals[i].start > te){
                ans.push_back(Interval(tb, te));
                tb = intervals[i].start;
                te = intervals[i].end;
            }
            else if(intervals[i].end > te) te = intervals[i].end;
        }
        ans.push_back(Interval(tb, te));
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值