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].
题目没有说所有间隔的start是依次增加的。所以,为了方便讨论,我们要将所有间隔按照start升序排列。因为间隔增加,就只需讨论end和下一个间隔。
结果集中是没有交叉出现的,排序后,遍历下一个时,只会跟结果集最后一个产生交叉,而不会跟在前的结果产生交叉(因为结果集中,最后一个间隔的start>前一个的end)
排列结束后,我们只需要讨论后一个跟前一个结果,如果后一个间隔的start大于前一个结果集中的间隔的end,那么没有交叉,直接添加 结果集。
否则该间隔就和结果集中最后一个间隔有交叉,这时要讨论该间隔的end和结果集中最后一个间隔的end大小,前者大,就要删除结果集最后一个,然后将前者加入结果集;如果后者大,说明只是end和start交叉了,这样删除结果集最后一个,添加新的间隔。见代码。
/**
* 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 {
public List<Interval> merge(List<Interval> intervals) {
List<Interval> res=new ArrayList<Interval>();
if(intervals==null||intervals.size()<=1) return intervals; Collections.sort(intervals,new Comparator<Interval>(){
public int compare(Interval o1,Interval o2){
return o1.start-o2.start;
}
});
res.add(intervals.get(0));
for(int i=1;i<intervals.size();i++){
Interval in1=res.get(res.size()-1); //结果集中最后一个间隔,用于比较
Interval in2=intervals.get(i); //当前间隔,只会与结果集中最后一个间隔产生交集。
if(in1.end<in2.start) res.add(in2); //没有交叉。直接加入
else { //有交叉
if(in1.end>=in2.end) continue;//前一个包含后一个,跳过
else{ //只是start和end交叉
res.remove(res.size()-1);
res.add(new Interval(in1.start,in2.end));
}
}
}
return res;
}
}
merge intervals(合并间隔)的更多相关文章
- [LeetCode] Merge Intervals 合并区间
Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8, ...
- [LeetCode] 56 - Merge Intervals 合并区间
Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...
- 056 Merge Intervals 合并区间
给出一个区间的集合, 请合并所有重叠的区间.示例:给出 [1,3],[2,6],[8,10],[15,18],返回 [1,6],[8,10],[15,18].详见:https://leetcode.c ...
- Leetcode56. Merge Intervals合并区间
给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] ...
- LeetCode 56. Merge Intervals 合并区间 (C++/Java)
题目: Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6] ...
- 【LeetCode每天一题】Merge Intervals(合并区间)
Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6],[8, ...
- [array] leetcode-56. Merge Intervals - Medium
leetcode-56. Merge Intervals - Medium descrition Given a collection of intervals, merge all overlapp ...
- 【leetcode】Merge Intervals
Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example,Given ...
- 【leetcode】 Merge Intervals
Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example,Given ...
随机推荐
- android文件混淆详解
-injars androidtest.jar[jar包所在地址] -outjars out[输出地址] -libraryjars 'D:\android-sdk-windows\plat ...
- Java之恋
初次见面那是一个河北的夏天风随沙散落天涯蝴蝶依旧恋着花回首走过的日子手指和键盘之间的梦想之光已恍如昨日 那年我还是一个刚踏进这个曾经只在地理课本上狂念南稻北麦,南油北花的土地那年你只是我必须要学的编程 ...
- Android的ExpandableListView-android学习之旅(二十八)
ExpandableListView简介 ExpandableListView是ListView的子类,用法和ListView类似,ExpandableListView可以创建几个类别,每个类别下面又 ...
- Android的自动完成文本框-android学习之旅(二十六)
AutoComplicatedTextView简介 AutoComplicatedTextView是从EditText派生出来的,可以使用EditText的所有的属性.当用户输入一定的内容后,会有提示 ...
- Socket接收器——Acceptor
Acceptor是JIoEndpoint的内部类,主要的职责就是监听是否有客户端套接字连接并接收socket,再将socket交由任务执行者(Executor)执行.不断从系统底层读取socket,接 ...
- mysql中 REPLACE INTO 和 INSERT INTO 的区别
mysql中 REPLACE INTO 和 INSERT INTO 的区别 REPLACE INTO 和 INSERT INTO 功能类似,都是像表中插入数据,不同点在于:REPLACE INTO 首 ...
- CUDA学习,使用shared memory实现Reverse Array
- OpenCV空洞填充算法
讨论帖: http://bbs.csdn.net/topics/391542633 在Matlab下,使用imfill可以很容易的完成孔洞填充操作,感觉这是一个极为常用的方法,然而不知道为什么Op ...
- Hibernate与Spring的事务管理
什么是事务 这个问题比较大,按照我的理解就是,一个事务内的n个操作,要么全部完成,一旦有一个操作有问题,那么所有的操作都全部回滚. Jdbc的事务 首先,大家已经知道了,事务说白了就是一个词----统 ...
- Struts的取值与标签
首先,我们都知道,在struts2中有一个valuestack.里面存放的就是action里的属性.同时,还有一个stackcontext,里面放的是map形式的request/session/att ...