[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 合并区间

浙公网安备 33010602011771号