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].
CSDN博客挂了,可能是和新浪接口那边出了问题,我是用新浪帐号登录的。
首先,是合并的规则
if(A.end<B.end&&A.end>B.start)
{
if(A.start<B.start)
B.start=A.start;
}//A的end在B的范围里面
if(A.start>B.start&&A.start<B.end)
{
if(A.end>B.end)
B.end=A.end
}//如果A的start在B的范围里面
还有一个不要漏掉了,就是B是被A包含的,即A.start<B.start&&A.end>B.end
一开始漏掉了最后一个条件判断。
所以相比之下还是比较喜欢这个而不是acm,因为acm错误的话没有给出例子。
其次是运算规则,
1:从示例中提出去第一个范围,然后依次和剩下的范围合并,从原来的示例中移去合并过的范围。
2:直至遍历一遍后。把这个新的范围加到结果集中。
3:依次重复以上步骤。
在这里,是另一个坑。因为示例给的范围可能是未排序的,因此有可能出现这种情况:
[[1,2],[3,4],[5,6],[7,8],[1,10]]
如果按照上面的结果,那么就会出现
结果为[[1,10],[3,4],[5,6],[7,8]]
因为第一次遍历后把[1,10]给移出,并且不会出现在后面的任何计算中。
因此,参考Floyd算法,对结果进行再次的合并。
重复的次数为一开始实例的子集个数。
这样子复杂度是O(n^3)
有点高,改进的话,应该是先开始对范围进行排序。
还有一个小的地方要注意,在对List进行remove操作,位置i应该--后再++
比如remove(i);i++
example, Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18].
CSDN博客挂了,可能是和新浪接口那边出了问题,我是用新浪帐号登录的。
首先,是合并的规则
if(A.end<B.end&&A.end>B.start)
{
if(A.start<B.start)
B.start=A.start;
}//A的end在B的范围里面
if(A.start>B.start&&A.start<B.end)
{
if(A.end>B.end)
B.end=A.end
}//如果A的start在B的范围里面
还有一个不要漏掉了,就是B是被A包含的,即A.start<B.start&&A.end>B.end
一开始漏掉了最后一个条件判断。
所以相比之下还是比较喜欢这个而不是acm,因为acm错误的话没有给出例子。
其次是运算规则,
1:从示例中提出去第一个范围,然后依次和剩下的范围合并,从原来的示例中移去合并过的范围。
2:直至遍历一遍后。把这个新的范围加到结果集中。
3:依次重复以上步骤。
在这里,是另一个坑。因为示例给的范围可能是未排序的,因此有可能出现这种情况:
[[1,2],[3,4],[5,6],[7,8],[1,10]]
如果按照上面的结果,那么就会出现
结果为[[1,10],[3,4],[5,6],[7,8]]
因为第一次遍历后把[1,10]给移出,并且不会出现在后面的任何计算中。
因此,参考Floyd算法,对结果进行再次的合并。
重复的次数为一开始实例的子集个数。
这样子复杂度是O(n^3)
有点高,改进的话,应该是先开始对范围进行排序。
还有一个小的地方要注意,在对List进行remove操作,位置i应该--后再++
比如remove(i);i++
这个时候,i实际上是指向原来i后面的第二个而不是i后面的第一个。
上代码:
import java.util.ArrayList;
import java.util.List;
import javax.swing.text.StyledEditorKit.ForegroundAction;
public class 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].
*
*/
// 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> mergetmp(List<Interval> intervals) {
List<Interval> resultIntervals = new ArrayList<Interval>();
for (; intervals.size() > 0;) {
Interval intervaltmp = intervals.remove(0);
for (int i=0;i<intervals.size();++i) {
if (intervals.get(i).end <= intervaltmp.end
&& intervals.get(i).end >= intervaltmp.start) {
if (intervals.get(i).start <= intervaltmp.start)
intervaltmp.start = intervals.get(i).start;
intervals.remove(i);
i--;
}else
if (intervals.get(i).start >= intervaltmp.start
&& intervals.get(i).start <= intervaltmp.end) {
if (intervals.get(i).end >= intervaltmp.end)
intervaltmp.end = intervals.get(i).end;
intervals.remove(i);
i--;
}else
if(intervals.get(i).start<=intervaltmp.start&&intervals.get(i).end>=intervaltmp.end){
intervaltmp.start=intervals.get(i).start;
intervaltmp.end=intervals.get(i).end;
intervals.remove(i);
i--;
}
}
resultIntervals.add(intervaltmp);
}
return resultIntervals;
}
public List<Interval> merge(List<Interval> intervals){
List<Interval> resultIntervals = intervals;
int count=intervals.size();
for(int i=0;i<count;++i){
resultIntervals=mergetmp(resultIntervals);
}
return resultIntervals;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}