leetcode合并区间
合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:我们采用非常直观的思维,观察各个区间,既然要对区间排列,首先对区间排序,使其按照左端点的大小进行排列。这里要用到数据结构的Collections.sort来进行排序。
需要了解Collections.sort( list ,new Comparator< >() );的排序写法。 注意这里很容易出错。
排序完之后,进行区间的划分。 首先将第一个区间作为比较区间temp
遍历整个List。 存在以下情况:1.如果temp的左端点和遍历区间的左端点不相交,当前temp加入数组,更新temp。
2.如果相交,那么当前区间的右端点小于遍历数组的右端点,更新temp的右端点。
因为区间按照左端点排序,不需要再处理左端点。
3.相交之下,如果当前区间右端点包含遍历区间,什么也不用做。
遍历完之后,把temp加入list。
/** * 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; } * } */ class Solution {List<Interval> list=new ArrayList(); public List<Interval> merge(List<Interval> intervals) { if(intervals.size()==0)return list; //list为空的情况,直接判出。 //Collections.sort()的具体用法。 比较对象是Interval这个类。最后将表按照左端点的顺序排列 Collections.sort(intervals,new Comparator<Interval>(){ public int compare(Interval a,Interval b){ return a.start-(b.start); } }); Interval temp=intervals.get(0); for(Interval aa:intervals){ //遍历表,判断3种条件。 if(temp.end<aa.start){ list.add(temp); temp=aa; }else { if(temp.end>=aa.end){ temp=temp; }else{ temp.start=temp.start; temp.end=aa.end; } } } list.add(temp); return list; } }