LeetCode 57. Insert Interval/56. Merge Intervals

1. 题目要求

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

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

2. 解题思路

57
基本思路就是, 遍历所给的数组, 当前的元素与需要插入的元素不重合, 直接输出, 否则更新新插入元素, 直到不存在重合部分

56
类似的思路还是一样遍历数组, 考察元素是否重合, 不重合直接输出, 否则进行合并操作

3. code

57

class Solution {
public:
    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
        vector<Interval> res;
        bool isInserted = false;
        for (int i = 0; i != intervals.size(); i++){
            if (!isInserted && intervals[i].end >= newInterval.start){
                if (intervals[i].start <= newInterval.end){
                    newInterval.start = min(intervals[i].start, newInterval.start);
                    newInterval.end = max(intervals[i].end, newInterval.end);
                }
                else{
                    res.push_back(newInterval);
                    isInserted = true;
                    res.push_back(intervals[i]);
                }
            }
            else
                res.push_back(intervals[i]);
        }
        if (!isInserted)
            res.push_back(newInterval);

        return res;
    }
};

56

class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        vector<Interval> res;
        sort(intervals.begin(), intervals.end(), [](const Interval & a, const Interval & b){return a.start < b.start; });
        for (int i = 0; i != intervals.size(); i++){
            if (i == intervals.size() - 1){
                res.push_back(intervals[i]);
                continue;
            }

            if (intervals[i].end >= intervals[i + 1].start){
                intervals[i + 1].start = intervals[i].start;
                intervals[i + 1].end = max(intervals[i].end, intervals[i + 1].end);
            }
            else{
                res.push_back(intervals[i]);
            }
        }
        return res;
    }
};

4. 大神解法

57 非常类似的思想

vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
    vector<Interval> ret;
    auto it = intervals.begin();
    for(; it!=intervals.end(); ++it){
        if(newInterval.end < (*it).start) //all intervals after will not overlap with the newInterval
            break; 
        else if(newInterval.start > (*it).end) //*it will not overlap with the newInterval
            ret.push_back(*it); 
        else{ //update newInterval bacause *it overlap with the newInterval
            newInterval.start = min(newInterval.start, (*it).start);
            newInterval.end = max(newInterval.end, (*it).end);
        }   
    }
    // don't forget the rest of the intervals and the newInterval
    ret.push_back(newInterval);
    for(; it!=intervals.end(); ++it)
        ret.push_back(*it);
    return ret;
}

你可能感兴趣的:(LeetCode)