[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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 合并区间
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法