[LeetCode] 56. Merge Intervals 合并区间
Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]] Output: [[1,6],[8,10],[15,18]] Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]] Output: [[1,5]] Explanation: Intervals [1,4] and [4,5] are considerred overlapping.
给定一个有重叠的区间集合,合并所有重叠的区间。先对区间以第一个元素进行排序,定义一个变量result记录合并后的区间。然后迭代这些区间,如果区间的开始值大于result的最后一个区间的结尾值,说明整个区间都在result的最后一个区间的右侧,直接添加到result。如果区间开始值小于result的最后一个区间的结尾值,则有重合需要合并,result中的最后一个区间的尾部值变为两个尾部中的最大值。
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 27 28 29 30 31 32 | public class Solution { public List<Interval> merge(List<Interval> intervals) { if (intervals == null || intervals.size() <= 1 ) { return intervals; } Collections.sort(intervals, new IntervalComparator()); List<Interval> result = new ArrayList<Interval>(); Interval last = intervals.get( 0 ); for ( int i = 1 ; i < intervals.size(); i++) { Interval curt = intervals.get(i); if (curt.start <= last.end ){ last.end = Math.max(last.end, curt.end); } else { result.add(last); last = curt; } } result.add(last); return result; } private class IntervalComparator implements Comparator<Interval> { public int compare(Interval a, Interval b) { return a.start - b.start; } } } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Solution { /** * @param intervals, a collection of intervals * @return: A new sorted interval list. */ public List<Interval> merge(List<Interval> intervals) { List<Interval> ans = new ArrayList<>(); intervals.sort(Comparator.comparing(i -> i.start)); Interval last = null ; for (Interval item : intervals) { if (last == null || last.end < item.start) { ans.add(item); last = item; } else { last.end = Math.max(last.end, item.end); } } return ans; } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | """ Definition of Interval. class Interval(object): def __init__(self, start, end): self.start = start self.end = end """ class Solution: # @param intervals, a list of Interval # @return a list of Interval def merge( self , intervals): intervals = sorted (intervals, key = lambda x: x.start) result = [] for interval in intervals: if len (result) = = 0 or result[ - 1 ].end < interval.start: result.append(interval) else : result[ - 1 ].end = max (result[ - 1 ].end, interval.end) return result |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution { public : static bool comp( const Interval &a, const Interval &b) { return (a.start < b.start); } vector<Interval> merge(vector<Interval> &intervals) { vector<Interval> res; if (intervals.empty()) return res; sort(intervals.begin(), intervals.end(), comp); res.push_back(intervals[0]); for ( int i = 1; i < intervals.size(); ++i) { if (res.back().end >= intervals[i].start) { res.back().end = max(res.back().end, intervals[i].end); } else { res.push_back(intervals[i]); } } return res; } }; |
类似题目:
[LeetCode] 57. Insert Interval 插入区间
All LeetCode Questions List 题目汇总
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· 软件产品开发中常见的10个问题及处理方法
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· MQ 如何保证数据一致性?
· 《HelloGitHub》第 108 期