首页 > 代码库 > LeetCode Merge Intervals
LeetCode Merge Intervals
题目: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]
.
思路分析:这题关键要想到先对区间排序,然后从前向后扫描,如果下一个没法合并,就添加一个结果区间;如果可以,还要继续向后看,保存当前的lower bound和upper bound,如果upper bound比下一个区间的上界小(肯定大于等于下一个区间的下界,否则属于无法合并的情况),那么用下一个区间上界更新upper bound。排序时要注意如果start相等,根据end排序。另外还有对于最后一个区间要特殊处理,不然可能出现漏掉最后一个区间的情况。另外这题需要对pair这种结构体排序,可以用Collections的sort方法,需要重写Comparator类的compare方法,然后构造Comparator对象传入sort作为第二个参数,制定排序规则。第一个参数是List对象。Collections的sort方法和Comparator类的compare方法重写非常常用,对于结构体排序的场景非常适合,要熟悉掌握。
AC Code:
/** * Definition for an interval. * public class Interval { * int start; * int end; * Interval() { start = 0; end = 0; } * Interval(int s, int e) { start = s; end = e; } * } */ public class Solution { public List<Interval> merge(List<Interval> intervals) { if(intervals.size() <= 1 || intervals == null) return intervals; else { List<Interval> res = new ArrayList<Interval>(); Comparator<Interval> comp = new Comparator<Interval>(){ public int compare (Interval i1, Interval i2){ if(i1.start == i2.start){ return i1.end - i2.end; } return i1.start - i2.start; } }; Collections.sort(intervals, comp); int lb = intervals.get(0).start; int ub = intervals.get(0).end; int index = 1; while(index < intervals.size()){ Interval cur = intervals.get(index); if(ub >= cur.start){ if(ub < cur.end) ub = cur.end; } else { Interval newInterval = new Interval(lb, ub); res.add(newInterval); lb = cur.start; ub = cur.end; } //Special case: when the interval is the last interval //you need to stop and generated a new interval based //on the current lb and ub if(index == intervals.size() - 1){ Interval newInterval = new Interval(lb, ub); res.add(newInterval); break; } index++; } return res; } } }
LeetCode Merge Intervals
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。