[LeetCode] 57. Insert Interval 插入区间
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. Merge Intervals的拓展,给定一个无重叠的区间集合,以开始时间排序好了,插入一个新的区间,保证集合区间仍然有序且不重叠(如果有必要的话合并区间)。
新建一个数组,先把结尾小于新区间开始的区间写入数组,然后对于后边的和新区间进行合并,生成新的区间,直到新区间的结束小于后边区间的开始,写入这个合并后的新区间和后边剩余的区间到新数组。还有一种做法是,这里要插入一个区间,就要比较新区间和就的区间列表中的区间,如果不需要合并,就直接插入。如果需要合并,则要合并新区间,并删除不需要的区间。
Java:
public class Solution { public List<Interval> insert(List<Interval> intervals, Interval newInterval) { if (newInterval == null || intervals == null) { return intervals; } List<Interval> results = new ArrayList<Interval>(); int insertPos = 0; for (Interval interval : intervals) { if (interval.end < newInterval.start) { results.add(interval); insertPos++; } else if (interval.start > newInterval.end) { results.add(interval); } else { newInterval.start = Math.min(interval.start, newInterval.start); newInterval.end = Math.max(interval.end, newInterval.end); } } results.add(insertPos, newInterval); return results; } }
Python:
class Solution(object): def insert(self, intervals, newInterval): result = [] i = 0 while i < len(intervals) and newInterval.start > intervals[i].end: result += intervals[i], i += 1 while i < len(intervals) and newInterval.end >= intervals[i].start: newInterval = Interval(min(newInterval.start, intervals[i].start), \ max(newInterval.end, intervals[i].end)) i += 1 result += newInterval, result += intervals[i:] return result
Python:
class Solution: def insert(self, intervals, newInterval): results = [] insertPos = 0 for interval in intervals: if interval.end < newInterval.start: results.append(interval) insertPos += 1 elif interval.start > newInterval.end: results.append(interval) else: newInterval.start = min(interval.start, newInterval.start) newInterval.end = max(interval.end, newInterval.end) results.insert(insertPos, newInterval) return results
C++:
class Solution { public: vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) { vector<Interval> res = intervals; int i = 0, overlap = 0, n = res.size(); while (i < n) { if (newInterval.end < res[i].start) break; else if (newInterval.start > res[i].end) {} else { newInterval.start = min(newInterval.start, res[i].start); newInterval.end = max(newInterval.end, res[i].end); ++overlap; } ++i; } if (overlap > 0) res.erase(res.begin() + i - overlap, res.begin() + i); res.insert(res.begin() + i - overlap, newInterval); return res; } };
C++:
class Solution { public: vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) { size_t i = 0; vector<Interval> result; // Insert intervals appeared before newInterval. while (i < intervals.size() && newInterval.start > intervals[i].end) { result.emplace_back(intervals[i++]); } // Merge intervals that overlap with newInterval. while (i < intervals.size() && newInterval.end >= intervals[i].start) { newInterval = {min(newInterval.start, intervals[i].start), max(newInterval.end, intervals[i].end)}; ++i; } result.emplace_back(newInterval); // Insert intervals appearing after newInterval. result.insert(result.end(), intervals.cbegin() + i, intervals.cend()); return result; } };
类似题目:
[LeetCode] 56. Merge Intervals 合并区间